| Perl Language Reference Manual by Larry Wall and others Paperback (6"x9"), 724 pages ISBN 9781906966027 RRP £29.95 ($39.95) Sales of this book support The Perl Foundation! Get a printed copy>>> |
7.18 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). Thus, a reasonably
portable way to find out the home directory might be:
$home = $ENV{'HOME'} // $ENV{'LOGDIR'} //
(getpwuid($<))[7] // die "You're homeless!\n";
In particular, this means that you shouldn't use this for selecting between two aggregates for assignment:
@a = @b || @c; # this is wrong @a = scalar(@b) || @c; # really meant this @a = @b ? @b : @c; # this works fine, though
As more readable alternatives to && and || when used for
control flow, Perl provides the and and or operators (see below).
The short-circuit behavior is identical. The precedence of "and"
and "or" is much lower, however, so that you can safely use them after a
list operator without the need for parentheses:
unlink "alpha", "beta", "gamma"
or gripe(), next LINE;
With the C-style operators that would have been written like this:
unlink("alpha", "beta", "gamma")
|| (gripe(), next LINE);
Using "or" for assignment is unlikely to do what you want; see below.
| ISBN 9781906966027 | Perl Language Reference Manual | See the print edition |