我无法让Params :: Validate按照我想要的方式工作。
#!/usr/local/bin/perl -w
use strict;
use Params::Validate qw/:all/;
use Data::Dumper;
sub foo {
my %args = validate(@_, {
bar => {
default => 99,
# TODO - Somehow use a callback to return a default if undefined
# ??!!??
# callbacks => { call_me => sub { return 99 if !defined shift }},
},
});
# $args{bar} //= 99; # Don't want to define default in 2 places
print Dumper(\%args);
}
foo({ bar => undef });
那么如何在args列表中设置/测试undef并用Params :: Validate替换为所谓的'default'?
答案 0 :(得分:2)
您需要设置$ _ [0]:
call_me => sub { $_[0] = 99 if not defined $_[0] }
@_是传入参数的别名,因此您可以将其用作原始参考。
此外,
$args{bar} ||= 99;
即使它是0或''(空字符串),也会重置栏,这听起来不像你想要的那样。使用
$args{bar} //= 99;
如果你使用perl 5.10或更高版本会做你想要的,但是。
根据你没有复制默认值的评论,我能想到的最好的是:
sub foo
{
unshift @_, bar => undef;
my %args = validate(@_,
{
bar => {
optional => 1,
callbacks => {
call_me => sub { $_[0] = 99 unless defined $_[0] },
},
},
},
);
print Dumper \%args;
}
这似乎有效,但我必须承认 - 这很难看。