內容

名稱

Params::Check - 一種通用的輸入解析/檢查機制。

語法

use Params::Check qw[check allow last_error];

sub fill_personal_info {
    my %hash = @_;
    my $x;

    my $tmpl = {
        firstname   => { required   => 1, defined => 1 },
        lastname    => { required   => 1, store => \$x },
        gender      => { required   => 1,
                         allow      => [qr/M/i, qr/F/i],
                       },
        married     => { allow      => [0,1] },
        age         => { default    => 21,
                         allow      => qr/^\d+$/,
                       },

        phone       => { allow => [ sub { return 1 if /$valid_re/ },
                                    '1-800-PERL' ]
                       },
        id_list     => { default        => [],
                         strict_type    => 1
                       },
        employer    => { default => 'NSA', no_override => 1 },
    };

    ### check() returns a hashref of parsed args on success ###
    my $parsed_args = check( $tmpl, \%hash, $VERBOSE )
                        or die qw[Could not parse arguments!];

    ... other code here ...
}

my $ok = allow( $colour, [qw|blue green yellow|] );

my $error = Params::Check::last_error();

說明

Params::Check 是一種通用的輸入解析/檢查機制。

它允許您透過範本驗證輸入。唯一的需求是參數必須命名。

Params::Check 可以為您執行下列事項

Params::Check 的大部分功能來自其範本,我們將在下方討論

範本

如您在摘要中看到的,根據您的範本,將驗證所提供的參數。

範本可以針對使用的每個鍵採取不同的規則集。

可用的規則如下

預設值

這是使用者未提供任何值時的預設值。這也是檢查類型完整性時 strict_type 將查看的類型(請見下方)。

必要

布林旗標,表示此參數是否為必要參數。如果標示為必要但未提供,check() 將會失敗。

嚴格類型

這會對提供的參數進行 ref() 檢查。此參數的 ref 必須與此檢查的預設值的 ref 相同才能通過。

例如,如果您堅持將陣列參考作為參數,這將非常有用。

已定義

如果此範本鍵為 true,則強制執行,如果使用者輸入提供了此鍵,其值為 defined。這僅表示使用者不得將 undef 傳遞為此鍵的值,且等於:allow => sub { defined $_[0] && 其他測試 }

不得覆寫

這允許您在範本中指定 常數。即,使用者不得變更的鍵。它幾乎允許您將所有 可設定 資料保留在一個地方;Params::Check 範本。

儲存

這允許您傳遞對純量的參考,資料將儲存在其中

my $x;
my $args = check(foo => { default => 1, store => \$x }, $input);

這基本上是簡寫,表示

my $args = check( { foo => { default => 1 }, $input );
my $x    = $args->{foo};

您可以變更全域變數 $Params::Check::NO_DUPLICATES 來控制是否在結果集中保留已儲存的鍵。請參閱下列的「全域變數」區段。

allow

一組用於驗證特定資料片段的準則,如果資料片段必須遵守特定規則。

請參閱 allow() 函式以取得詳細資料。

函式

check( \%tmpl, \%args, [$verbose] );

此函式預設不會匯出,因此您必須透過下列方式要求它

use Params::Check qw[check];

或改用其完全限定的名稱。

check 會採用下列的引數清單

範本

這是一個雜湊參考,包含範本,如 SYNOPSISTemplate 區段中所述。

引數

這是命名引數雜湊的參考,需要檢查。

詳細

布林值,用於指示 check 是否應詳細說明並警告檢查中出了什麼問題。

您可以透過將封裝變數 $Params::Check::VERBOSE 設定為 true 值來啟用這個程式範圍。有關詳細資料,請參閱下列的「全域變數」區段。

check 會在失敗時傳回,或在成功時傳回已剖析引數的小寫鍵雜湊參考。

因此,呼叫檢查的典型範例如下所示

my $parsed = check( \%template, \%arguments, $VERBOSE )
                or warn q[Arguments could not be parsed!];

check() 的許多行為都可以透過設定封裝變數來變更。請參閱「全域變數」區段以取得相關詳細資料。

allow( $test_me, \@criteria );

範本中 allow 鍵所處理的函式也可獨立使用。

此函式採用第一個引數來針對測試進行測試,並採用第二個引數來採用範本中 allow 鍵也允許的任何形式的準則。

您可以對 allow 使用下列類型的值

字串

提供的參數必須等於字串,驗證才會通過。

regexp

提供的參數必須符合正規表示式,驗證才會通過。

subroutine

提供的子常式必須傳回 true,驗證才會通過,參數才會被接受。

(這對於更複雜的資料特別有用)。

array ref

提供的參數必須等於陣列 ref 的其中一個元素,驗證才會通過。陣列 ref 可以包含以上所有值。

如果鍵符合條件,則傳回 true,否則傳回 false。

last_error()

傳回一個字串,其中包含上次呼叫 check 時所報告的所有警告和錯誤。

當 verbose 標記開啟時,如果你想以其他方式報告,而不是使用 carp,這會很有用。

依據要求匯出。

全域變數

Params::Check 的行為可以透過變更下列全域變數來改變

$Params::Check::VERBOSE

這會控制 Params::Check 是否會發出警告和說明,說明某些事情可能失敗的原因。如果你將它設定為 0,Params::Check 就不會輸出任何警告。

警告 已啟用時,預設值為 1,否則為 0;

$Params::Check::STRICT_TYPE

這就像你可以傳遞給 checkstrict_type 選項,它會為所有呼叫 check 的動作,在全域啟用 strict_type

預設值為 0;

$Params::Check::ALLOW_UNKNOWN

如果你設定這個標記,未知的選項仍會存在於回傳值中,而不是被過濾掉。如果你只對幾個參數有興趣,並且想將其餘的參數直接傳遞給另一個子常式,這會很有用。

預設值為 0;

$Params::Check::STRIP_LEADING_DASHES

如果你設定這個標記,所有以以下方式傳遞的鍵

function( -key => 'val' );

都會移除其開頭的破折號。

$Params::Check::NO_DUPLICATES

如果設定為 true,範本中所有標記為要儲存在純量中的鍵,也會從結果集中移除。

預設值為 false,表示當你使用 store 作為範本鍵時,check 會將它放在你提供的純量中,以及它傳回的雜湊中。

$Params::Check::PRESERVE_CASE

如果設為 true,Params::Check 將不再將使用者輸入的所有鍵轉換為小寫,而是預期它們與範本提供的相同。當您要在範本中使用大小寫不同的類似鍵時,這會很有用。

請了解這會移除此模組的不區分大小寫功能。

預設為 0;

$Params::Check::ONLY_ALLOW_DEFINED

如果設為 true,Params::Check 將要求傳遞的所有值都為 defined。如果您希望在「每個鍵」的基礎上啟用此功能,請改用範本選項 defined

預設為 0;

$Params::Check::SANITY_CHECK_TEMPLATE

如果設為 true,Params::Check 將對範本進行健全性檢查,驗證錯誤和未知鍵。雖然對除錯非常有用,但在熱程式碼和大迴圈中可能會有點慢。

若要停用此檢查,請將此變數設為 false

預設為 1;

$Params::Check::WARNINGS_FATAL

如果設為 true,Params::Check 在範本驗證期間發生錯誤時將會 croak,而不是傳回 false

預設為 0;

$Params::Check::CALLER_DEPTH

此全域變數會修改 Params::Check::check() 傳遞給 caller() 的引數,如果您在 Params::Check::check() 周圍有自訂包裝函式,這會很有用。此值必須是整數,表示在實際函式呼叫和 Params::Check::check() 之間插入的包裝函式數目。

使用自訂堆疊追蹤的包裝函式範例

sub check {
    my ($template, $args_in) = @_;

    local $Params::Check::WARNINGS_FATAL = 1;
    local $Params::Check::CALLER_DEPTH = $Params::Check::CALLER_DEPTH + 1;
    my $args_out = Params::Check::check($template, $args_in);

    my_stacktrace(Params::Check::last_error) unless $args_out;

    return $args_out;
}

預設為 0;

致謝

感謝 Richard Soderberg 提升效能。

錯誤回報

請將錯誤或其他問題回報至 <bug-params-check@rt.cpan.org>。

作者

此模組由 Jos Boumans <kane@cpan.org> 所撰寫。

著作權

此函式庫為自由軟體;您可以在與 Perl 相同的條款下重新散布和/或修改它。