B Chen
B Chen

Reputation: 923

Why do Perl's logical operators &&, ||, ! take precedence over and, or, and not?

This is probably a minor point, but I was wondering why Perl's logical operators (&&, ||, and !) take precedence over the easily understandable "English" logical operators (and, or and not). Is there any advantage of using the former set and any disadvantage of using the latter set in a script?

Upvotes: 13

Views: 7522

Answers (4)

Evan Carroll
Evan Carroll

Reputation: 1

Logical Precedence and Clarity

While I have no idea whether this was the reason that got them in the language, they're incredibly useful for writing clear code,

## Some sample data...
my ($foo, $bar, $baz) = (0,1,1);

## Different results..
say ( $foo && $bar || $baz );
say ( $foo and $bar || $baz );

We can use this in code, even with \n. No noisy parens needed.

## When would you use this...
if (
  $cache->is_outdated
  and $db_master->has_connection || $db_slave->has_connection
) {
  $cache->refresh
}

This would otherwise have to be,

  $cache->is_outdated
  && ( $db_master->has_connection || $db_slave->has_connection )

But, perl doesn't like all that line-noise that other languages force upon its users.

Upvotes: -1

mvp
mvp

Reputation: 116477

converting comment to an answer:

If these operators were identical in preference, it would not be necessary to keep both versions - having only one version would be enough.

But Larry Wall is a linguist, and he really liked to use plain English words across his new language. So, he introduced these English-style operators (alongside with unless and others).

To keep C-style operators and their classic meaning, he needed to make new keywords not redundant. Because of that he assigned slightly different meaning to these operators that he liked better. So that difference turned out to be operator precedence.

Upvotes: -3

ikegami
ikegami

Reputation: 386706

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.

Upvotes: 14

Jonathan Leffler
Jonathan Leffler

Reputation: 755114

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.

Upvotes: 24

Related Questions