如何在Perl中获取Params::Validate中的字段名 验证( @_, { foo=>{ 回调=>{ “比面包盒小”=>sub{shift()sub{ 如果$[0]eq为“绿色”|$[0]eq为“蓝色”,则返回1; &$failed(“**fieldname**值无效”); } 条形图=>{ 回调=>{ “黄色或红色”=>sub{ 如果$[0]eq“黄色”|$[0]eq“红色”,则返回1; &$failed(“**fieldname**值无效”); } } } } );
如何在Perl中获取Params::Validate中的字段名 验证( @_, { foo=>{ 回调=>{ “比面包盒小”=>sub{shift()sub{ 如果$[0]eq为“绿色”|$[0]eq为“蓝色”,则返回1; &$failed(“**fieldname**值无效”); } 条形图=>{ 回调=>{ “黄色或红色”=>sub{ 如果$[0]eq“黄色”|$[0]eq“红色”,则返回1; &$failed(“**fieldname**值无效”); } } } } );,perl,validation,params,Perl,Validation,Params,Params::Validate-在上述代码中,如果我的验证失败,我将调用子例程failed,并在其中显示错误消息。我希望从验证失败的Params Validate中的回调中获取字段名,而不是直接在失败的子例程中传递字段名。这里,foo和bar是fieldnam是的。如何获取字段名?您可以尝试以下方法: validate( @_, { foo => { callbacks => { 'smalle
Params::Validate
-在上述代码中,如果我的验证失败,我将调用子例程failed,并在其中显示错误消息。我希望从验证失败的Params Validate中的回调中获取字段名,而不是直接在失败的子例程中传递字段名。这里,foo和bar是fieldnam是的。如何获取字段名?您可以尝试以下方法:
validate(
@_,
{
foo => {
callbacks => {
'smaller than a breadbox' => sub { shift() < $breadbox },
'green or blue' => sub {
return 1 if $_[0] eq 'green' || $_[0] eq 'blue';
&$failed(‘**fieldname** value is Invalid’);
}
bar => {
callbacks => {
'yellow or red' => sub {
return 1 if $_[0] eq 'yellow ' || $_[0] eq 'red';
&$failed(‘**fieldname** value is Invalid’);
}
}
}
}
);
使用严格;
使用警告;
使用Params::Validate;
我的%模板=
(
条形图=>{
“颜色正确”=>sub{
我的($fieldname,$value)=@[0..1];
如果$value eq为“绿色”| |$value eq为“蓝色”,则返回1;
失败(“$fieldname”:值“$value”无效”);
}
},
foo=>{
“比面包箱小”=>sub{
我的($fieldname,$value)=@[0..1];
如果$value<20,则返回1;
失败(“$fieldname”值“$value”无效”);
}
}
);
func(bar=>green',foo=>14);
func(条=>黄色,foo=>17);
子函数{
我的%validate=map{$\=>{callbacks=>get{u callbacks($$\$template{$\}}}
密钥%模板;
验证(@\%validate);
}
sub-get_回调{
我的($fname,$callbacks)=@;
我的%cb;
对于我的$name(键%$callbacks){
$cb{$name}=sub{
我的$fieldname=$fname;
$callbacks->{$name}->($fieldname,@)
};
}
返回\%cb;
}
潜艇失败{
模具$u0];
}
注意:这使用闭包来定义一个持久的fieldname变量。有关更多信息,请参阅。ok,这只是一个示例。您是否可以澄清您的问题?如果有一个字段,则有多个字段,这将不起作用
use strict;
use warnings;
use Params::Validate;
my %template =
(
bar => {
'color correct' => sub {
my ($fieldname, $value) = @_[0..1];
return 1 if $value eq 'green' || $value eq 'blue';
failed("'$fieldname': value '$value' is invalid");
}
},
foo => {
'smaller than a breadbox' => sub {
my ($fieldname, $value) = @_[0..1];
return 1 if $value < 20;
failed("'$fieldname' value '$value' is invalid");
}
}
);
func( bar => 'green', foo => 14 );
func( bar => 'yellow', foo => 17 );
sub func {
my %validate = map { $_ => { callbacks => get_callbacks( $_, $template{$_} ) } }
keys %template;
validate( @_, \%validate );
}
sub get_callbacks {
my ( $fname, $callbacks ) = @_;
my %cb;
for my $name (keys %$callbacks ) {
$cb{$name} = sub {
my $fieldname = $fname;
$callbacks->{$name}->( $fieldname, @_ )
};
}
return \%cb;
}
sub failed {
die $_[0];
}