3

我无法让 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 替换为所述“默认”值?

4

1 回答 1

2

您需要设置 $_[0]:

call_me => sub { $_[0] = 99 if not defined $_[0] }

@_ 是传入参数的别名,因此您可以将其用作对原始参数的引用。

还,

$args{bar} ||= 99;

即使它是 0 或 ''(空字符串)也会重置 bar,这听起来不像你想要的。使用

$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;
}

这似乎有效,但我不得不承认 - 这很丑。

于 2009-04-20T23:18:05.193 回答