[tpm] Is there a three-way version of...

John Macdonald john at perlwolf.com
Fri May 29 13:43:56 PDT 2009


On Fri, May 29, 2009 at 04:20:48PM -0400, Mike Stok wrote:
> As of perl 5.10 (I think) it is the "defined or" operator which only  
> returns the right hand side if the left hand side is undef, from perlop:
>
>        C−style Logical Defined‐Or
>
>        Although it has no direct equivalent in C, Perl’s "//" operator is
>        related to its C−style or.  In fact, it’s exactly the same as 
> "||",
>        except that it tests the left hand side’s definedness instead of 
> its
>        truth.  Thus, "$a // $b" is similar to "defined($a) || $b" (except 
> that
>        it returns the value of $a rather than the value of  
> "defined($a)") and
>        is exactly equivalent to "defined($a) ? $a : $b".  This is very 
> useful
>        for providing default values for variables.  If you actually want 
> to
>        test if at least one of $a and $b is defined, use "defined($a // 
> $b)".
>
>        The "||", "//" and "&&" operators return the last value evaluated
>        (unlike C’s "||" and "&&", which return 0 or 1).

This is especially useful for setting a value that can come from
multiple optional locations, and using the first one that was
actually provided:

    $foo = $opt{foo} || $ENV{PROG_FOO} || $rc_opts{foo} || 'default';

and, as Mike said, this will still take the first one found even
if the explicitly provided value is 0 or ''.  e.g.:

    prog --foo=0

The || operator would skip this setting (because it's false) and
go on to getting the setting of foo from the alternate sources.


More information about the toronto-pm mailing list