in reply to Re^3: Correct idiom for default parameters
in thread Correct idiom for default parameters

careful!

passing undef in between will break your idiom.

IMHO better check scalar @_ or care explicitly about passing undef !

sub defaults { my( $p1, $p2, $p3) = map{ defined $_[0] ? shift : $_ }( 1, 2, 3 ); + print "p1:$p1; p2:$p2; p3:$p3\n"; }; defaults(undef, 0, 0);

Cheers Rolf

Replies are listed 'Best First'.
Re^5: Correct idiom for default parameters
by BrowserUk (Patriarch) on Apr 28, 2010 at 22:59 UTC

    Sorry, I don't follow?

    Passing undef gives exactly the effect I would expect and desire. That of accepting the default for that parameter:

    test( 'a', undef, 'c' );; p1:a; p2:2; p3:c

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      well, thats not the result I get:

      sub defaults { my( $p1, $p2, $p3) = map{ defined $_[0] ? shift : $_ }( 1, 2, 3 ); + print "p1:$p1; p2:$p2; p3:$p3\n"; };; defaults('a', undef, 'c');

      p1:a; p2:2; p3:3

      $p3 ne 'c'

      the first undef value omits the shift, all following parameters will be replaced by defaults! You need an explicit shift after the colon!

      Cheers Rolf

        Arg! You're right. I tried it against my 5.10 version, because it was sitting there at the command prompt:

        sub test{ my($p1,$p2,$p3) = map shift // $_,(1,2,3); print "p1:$p1; p2:$p2; p3:$p3"; };; [0] Perl> test();; p1:1; p2:2; p3:3 [0] Perl> test( 'a', 'b', 'c' );; p1:a; p2:b; p3:c [0] Perl> test( 'a', , 'c' );; p1:a; p2:c; p3:3 [0] Perl> test( 'a', undef, 'c' );; p1:a; p2:2; p3:c

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.