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.

Tags:

Perl