2009-04-20 10 views
3

Params :: Validateがうまく動作するようになっています。未定義の値が渡された場合、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 }); 

は、どのように私は、引数リストにはundef用/テストを設定し、PARAMS ::検証と言った「デフォルト」の値で置き換えますか?

+0

barへの参照なしでfooを呼び出します。 –

答えて

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

動作しているようですが、私は認めざるを得ない - それは醜いです。

+0

「default => 99」という仕様を参照する方法はありますか? 私がfoo({})を呼び出すと、barはまだ設定されていて、デフォルト値は1か所にしか指定されていませんか? – CoffeeMonster

関連する問題