2009-04-20 9 views
3

Je n'arrive pas à obtenir Params :: Validate pour fonctionner comme je le souhaite.Définition de la valeur par défaut avec Params :: Validate si une valeur indéfinie est transmise

#!/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 }); 

Alors, comment puis-je configurer/test pour un FNUD dans la liste des args et les remplacer par ladite valeur « par défaut » avec Params :: Valider ??

+0

Appelez foo sans référence à la barre. –

Répondre

2

Vous devez établirons $ _ [0]:

call_me => sub { $_[0] = 99 if not defined $_[0] } 

@_ est aux paramètres un alias passé, donc vous pouvez l'utiliser comme une référence à l'original.

En outre,

$args{bar} ||= 99; 

réinitialisait bar, même si elle était 0 ou « » (chaîne vide), qui ne ressemble pas à ce que vous voulez. Utiliser

$args{bar} //= 99; 

Si vous utilisez Perl 5.10 ou version ultérieure, vous ferez ce que vous voulez.

Sur la base de vos commentaires de ne pas dupliquer la valeur par défaut, le meilleur que je pouvais venir avec est:

sub foo 
{ 
    unshift @_, bar => undef; 
    my %args = validate(@_, 
         { 
          bar => { 
           optional => 1, 
           callbacks => { 
            call_me => sub { $_[0] = 99 unless defined $_[0] }, 
           }, 
          }, 
         }, 
         ); 
    print Dumper \%args; 
} 

Cela semble fonctionner, mais je dois admettre - c'est moche.

+0

Existe-t-il un moyen de référencer les spécifications par défaut => 99 '? Donc, si j'appelle foo ({}) alors la barre est toujours définie et la valeur par défaut n'est spécifiée qu'à un endroit? – CoffeeMonster