What is the difference between the C-style operators &&
, ||
, ... and their Perl human-readable version "and
", "or
", ...?
It seems that Internet code uses them both:
open (FILE, $file) or die("cannot open $file"); open (FILE, $file) || die("cannot open $file");
$a || $b performs logical OR of two variables or expressions. The logical || operator checks either a variable or expression is true.
The && and || Operators in JavaScript. If applied to boolean values, the && operator only returns true when both of its operands are true (and false in all other cases), while the || operator only returns false when both of its operands are false (and true in all other cases).
== (equal to) Checks if the value of two operands are equal or not, if yes then condition becomes true.
OR ( || ) - If EITHER or BOTH sides of the operator is true, the result will be true. AND ( && ) - If BOTH and ONLY BOTH sides of the operator are true, the result will be true.
From Perl documentation:
On the right side of a list operator, it has very low precedence, such that it controls all comma-separated expressions found there. The only operators with lower precedence are the logical operators "and", "or", and "not", which may be used to evaluate calls to list operators without the need for extra parentheses.
Binary "or" returns the logical disjunction of the two surrounding expressions. It's equivalent to
||
, except for the very low precedence. This makes it useful for control flow
print FH $data or die "Can't write to FH: $!";
This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is false. Due to its precedence, you should probably avoid using this for assignment, only for control flow.
$a = $b or $c; # Bug: this is wrong
($a = $b) or $c; # Really means this
$a = $b || $c; # Better written this way
However, when it's a list-context assignment and you're trying to use "||" for control flow, you probably need "or" so that the assignment takes higher precedence.
@info = stat($file) || die; # Oops, scalar sense of stat!
@info = stat($file) or die; # Better, now @info gets its due
Then again, you could always use parentheses.
If any list operator (print(), etc.) or any unary operator (chdir(), etc.) is followed by a left parenthesis as the next token, the operator and arguments within parentheses are taken to be of highest precedence, just like a normal function call.
For example, because named unary operators have higher precedence than ||:
chdir $foo || die; # (chdir $foo) || die
chdir($foo) || die; # (chdir $foo) || die
chdir ($foo) || die; # (chdir $foo) || die
chdir +($foo) || die; # (chdir $foo) || die
!
, &&
, ||
, and ^
have high precedence such that they are useful in constructing an expression; not
, and
, or
, and xor
have low precedence such that they are useful for flow control between what are essentially different expressions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With