What is the difference between Perl's ( or, and ) and ( ||, && ) short-circuit operators?
Solution 1:
Due to the low precedence of the 'or' operator, or3 parses as follows:
sub or3 {
my ($a,$b) = @_;
(return $a) or $b;
}
The usual advice is to only use the 'or' operator for control flow:
@info = stat($file) or die;
For more discussion, see the perl manual: http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or
Solution 2:
What rules of thumb do you use to decide which construct to use and make sure the code is doing what you think it is doing
The operator precedence rules.
||
binds tightly, or
binds weakly. There is no "rule of thumb".
If you must have a rule of thumb, how about "only use or
when there is no lvalue":
or
:
open my $fh, '>', 'file' or die "Failed to open file: $!"
||
:
my $greeting = greet() || $fallback || 'OH HAI';
I agree with MJD about avoiding parens; if you don't know the rules, look them up... but don't write (open(my $fh, '>', 'file')) or (die("Failed to open file: $!"))
"just to be sure", please.
Solution 3:
In Perl 5, "or" and "and" have lower precedence than "||" and "&&". Check out this PerlMonks thread for more info:
http://www.perlmonks.org/?node_id=155804
Solution 4:
Both versions are short-circuiting in Perl, but the 'textual' forms ('and' and 'or') have a lower precedence than their C-style equivalents.
http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlop.html#Logical_And
Solution 5:
My guess is that or3 is different.
I'm not really a Perl guy, but it looks like 1, 2, and 4 all explicitly return booleans. I'm guessing 3 has side effects, such as returning $a or something crazy like that.
looks down
Hey, I was right.