2009-04-20 4 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 }); 

그래서 어떻게 args 목록에서 undef를 설정하고 Params :: Validate로 '기본'값으로 바꾸는가?

+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 ({})를 호출하면 막대가 계속 설정되고 기본값은 한 곳에서만 지정됩니다. – CoffeeMonster