Innstilling standardverdien med Params :: Valider hvis en udefinert verdi vedtatt i

stemmer
3

Jeg har problemer med å få Params :: Bekreft for å jobbe slik jeg vil ha det til.

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

Så hvordan kan jeg sette / test for en udef i listen args og erstatte med nevnte 'standard' verdi med Params :: Valider ??

Publisert på 20/04/2009 klokken 23:14
kilden bruker
På andre språk...                            


1 svar

stemmer
2

Du må sette $ _ [0]:

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

@_ er aliaser til de parametere som sendes inn, slik at du kan bruke dette som en referanse til den opprinnelige.

Også,

$args{bar} ||= 99;

vil tilbakestille bar selv om det var 0 eller '' (tom streng), som ikke høres ut som det du ønsker. Ved hjelp av

$args{bar} //= 99;

hvis du bruker perl 5.10 eller senere ville gjøre hva du vil, skjønt.

Basert på din kommentar til ikke å duplisere standard, det beste jeg kunne komme opp med er:

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

Det ser ut til å fungere, men jeg må innrømme - det er stygt.

Svarte 20/04/2009 kl. 23:18
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more