如何在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];
}