my $value = shift() || 'default';
and
my $value = shift() or 'default';
will not work the same.
my $value = shift() || 'default';
will set $value to the value returned by shift() if it is true and to 'default' if it is false.
my $value = shift() or 'default';
will set $value to the value returned by shift() no matter what!
Here is an example using a handy tool B::Deparse that will show you how the compiler read your program, the -p adds extra parentheses to make it very clear.
#temp.pl
$value = $x or $y or $z;
$value = $x || $y || $z;
$value = $x or $y || $z;
$value = $x || $y or $z;
then run
perl -MO=Deparse,-p temp.pl
it outputs
((($value = $x) or $y) or $z);
($value = (($x || $y) || $z));
(($value = $x) or ($y or $z));
(($value = ($x || $y)) or $z);
temp.pl syntax OK
if you notice
$value = $x or $y or $z;
and
$value = $x or $y || $z;
just set $value to the value of $x no matter what the value of $y or $z because or has a lower precidence than =.
Did you notice that
$value = $x || $y or $z;
will just set $value to the value of $x || $y no matter what the value of $z?
-- flounder |