内容

名称

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 相同。

例如,如果您坚持使用数组引用作为参数,这将非常有用。

已定义

如果此模板键为真,则强制执行:如果用户输入提供此键,则其值为 defined。这仅仅意味着用户不允许传递 undef 作为此键的值,并且等效于:allow => sub { defined $_[0] && OTHER TESTS }

不允许覆盖

这允许您在模板中指定 constants。即,不允许用户更改的键。它几乎允许您将所有 configurable 数据保存在一个地方;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() 函数。

函数

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

此函数默认情况下不会导出,因此您需要通过以下方式请求它

use Params::Check qw[check];

或者使用它的完全限定名称。

check 接受一个参数列表,如下所示

模板

这是一个哈希引用,包含一个模板,如 SYNOPSISTemplate 部分所述。

参数

这是一个对命名参数哈希的引用,需要进行检查。

详细

一个布尔值,指示 check 是否应该详细并警告检查中出现的问题。

您可以通过将包变量 $Params::Check::VERBOSE 设置为真值来在整个程序中启用此功能。有关详细信息,请参阅下面的 全局变量 部分。

check 在失败时返回,或在成功时返回一个带有解析参数的小写键的哈希引用。

因此,对 check 的典型调用看起来像这样

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

check() 的许多行为可以通过设置包变量来改变。有关详细信息,请参阅 全局变量 部分。

allow( $test_me, \@criteria );

处理模板中 allow 键的函数也可以独立使用。

该函数以要测试的键作为第一个参数,以任何形式的标准作为第二个参数,这些标准也允许模板中的 allow 键。

您可以使用以下类型的 allow 值

字符串

提供的参数必须等于字符串才能通过验证。

正则表达式

提供的参数必须匹配正则表达式才能通过验证。

子例程

提供的子例程必须返回 true 才能通过验证并接受参数。

(这对于更复杂的数据特别有用)。

数组引用

提供的参数必须等于数组引用中的一个元素才能通过验证。数组引用可以包含所有上述值。

如果键匹配标准,则返回 true,否则返回 false。

last_error()

返回一个字符串,其中包含上次调用 check 时报告的所有警告和错误。

如果您想以其他方式报告,而不是在 verbose 标志打开时 carp,这将很有用。

它是在请求时导出的。

全局变量

可以通过更改以下全局变量来改变 Params::Check 的行为

$Params::Check::VERBOSE

这控制着 Params::Check 是否会发出警告和解释,说明为什么某些事情可能失败。如果将其设置为 0,Params::Check 不会输出任何警告。

默认情况下,当 warnings 启用时为 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 的性能改进。

错误报告

请将错误或其他问题报告给 <[email protected]>。

作者

此模块由 Jos Boumans <[email protected]> 编写。

版权

此库是免费软件;您可以根据与 Perl 本身相同的条款重新发布和/或修改它。