Reputation: 923
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
Reputation: 1
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
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
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
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