Why do Perl's logical operators &&, ||, ! take precedence over and, or, and not?
The original &&
, ||
and !
operators are high precedence to match the C language.
The newer (but still old) and
, or
and not
operators were added to simplify some common constructs. For example, compare:
open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";
The first of these is incorrect; the high priority ||
binds with $filename
and die
which is not what you want. The second is correct; the low priority or
means that the missing parentheses do not lead to ambiguity.
If ||
and or
had the same precedence, then
return some_func $test1 || $test2;
would mean
return some_func($test1) || $test2;
instead of
return some_func($test1 || $test2);
or
some_func $test1 or die;
would mean
some_func($test1 or die);
instead of
some_func($test1) or die;
Neither of those changes are desirable.
And while one could debate or
is more easily understood than ||
, it's harder to read. It's easier to read code when the operators don't look like their operands.