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()
函数。
此函数默认情况下不会导出,因此您需要通过以下方式请求它
use Params::Check qw[check];
或者使用它的完全限定名称。
check
接受一个参数列表,如下所示
这是一个哈希引用,包含一个模板,如 SYNOPSIS
和 Template
部分所述。
这是一个对命名参数哈希的引用,需要进行检查。
一个布尔值,指示 check
是否应该详细并警告检查中出现的问题。
您可以通过将包变量 $Params::Check::VERBOSE
设置为真值来在整个程序中启用此功能。有关详细信息,请参阅下面的 全局变量
部分。
check
在失败时返回,或在成功时返回一个带有解析参数的小写键的哈希引用。
因此,对 check 的典型调用看起来像这样
my $parsed = check( \%template, \%arguments, $VERBOSE )
or warn q[Arguments could not be parsed!];
check()
的许多行为可以通过设置包变量来改变。有关详细信息,请参阅 全局变量
部分。
处理模板中 allow
键的函数也可以独立使用。
该函数以要测试的键作为第一个参数,以任何形式的标准作为第二个参数,这些标准也允许模板中的 allow
键。
您可以使用以下类型的 allow 值
提供的参数必须等于字符串才能通过验证。
提供的参数必须匹配正则表达式才能通过验证。
提供的子例程必须返回 true 才能通过验证并接受参数。
(这对于更复杂的数据特别有用)。
提供的参数必须等于数组引用中的一个元素才能通过验证。数组引用可以包含所有上述值。
如果键匹配标准,则返回 true,否则返回 false。
返回一个字符串,其中包含上次调用 check
时报告的所有警告和错误。
如果您想以其他方式报告,而不是在 verbose 标志打开时 carp
,这将很有用。
它是在请求时导出的。
可以通过更改以下全局变量来改变 Params::Check 的行为
这控制着 Params::Check 是否会发出警告和解释,说明为什么某些事情可能失败。如果将其设置为 0,Params::Check 不会输出任何警告。
默认情况下,当 warnings 启用时为 1,否则为 0;
这就像你可以传递给 check
的 strict_type
选项一样,它将为所有对 check
的调用全局启用 strict_type
。
默认值为 0;
如果设置此标志,未知选项将仍然存在于返回值中,而不是被过滤掉。如果你的子程序只对几个参数感兴趣,并且希望将其余参数盲目地传递给另一个子程序,这将很有用。
默认值为 0;
如果设置此标志,所有以以下方式传递的键
function( -key => 'val' );
将删除其前导连字符。
如果设置为 true,模板中所有标记为存储在标量中的键也将从结果集中删除。
默认值为 false,这意味着当你使用 store
作为模板键时,check
将将其同时放入你提供的标量中,以及它返回的哈希引用中。
如果设置为 true,Params::Check 将不再将来自用户输入的所有键转换为小写,而是期望它们与模板提供的案例一致。当你想在你的模板中使用具有不同大小写的类似键时,这很有用。
请注意,这将删除此模块的大小写不敏感功能。
默认值为 0;
如果设置为 true,Params::Check 将要求传递的所有值都为 defined
。如果你希望在“每个键”的基础上启用此功能,请使用模板选项 defined
。
默认值为 0;
如果设置为 true,Params::Check 将对模板进行完整性检查,验证是否存在错误和未知键。虽然这对调试非常有用,但在热代码和大型循环中可能比较慢。
要禁用此检查,请将此变量设置为 false
。
默认值为 1;
如果设置为 true,Params::Check 在模板验证期间发生错误时将 croak
,而不是返回 false
。
默认值为 0;
此全局变量修改了 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 本身相同的条款重新发布和/或修改它。