Which of these subroutines is not like the other?
sub or1 {
my ($a,$b) = @_;
return $a || $b;
}
sub or2 {
my ($a,$b) = @_;
$a || $b;
}
sub
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
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
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.
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.
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