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または''(空の文字列)であってもバーをリセットします。これは、希望どおりに聞こえません。使用する

$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 に答える