2009-04-20 67 views
3

我無法讓Params :: Validate工作,我希望如何工作。使用Params設置默認值::驗證是否傳入了未定義的值

#!/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列表的民主基金,並使用參數::驗證說「默認」值替換?

+0

調用沒有引用條的foo。 – 2009-04-22 17:04:23

回答

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

有沒有辦法引用規格的默認=> 99'? 因此,如果我調用foo({}),那麼bar仍然被設置並且默認值僅在一個地方指定? – CoffeeMonster 2009-04-20 23:27:19