2009-04-20 2 views
3

У меня возникли проблемы с получением Params :: Подтвердить работу, как я хочу.Установка значения по умолчанию с 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 }); 

Так как я устанавливаю/тест для UNDEF в списке аргументов и заменить с указанным значением «по умолчанию» с Params :: Validate ??

+0

вызов 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

Есть ли способ ссылаться на спецификации по умолчанию => 99 '? Итак, если я вызываю foo ({}), тогда бар все еще установлен, а значение по умолчанию указывается только в одном месте? – CoffeeMonster