[英]What is the difference between "||" and "or" in Perl?
C 风格的运算符&&
、 ||
之间有什么区别 , ... 以及他们的 Perl 人类可读版本 " and
", " or
", ...?
似乎互联网代码同时使用了它们:
open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");
从Perl 文档:
在列表运算符的右侧,它具有非常低的优先级,因此它控制在那里找到的所有以逗号分隔的表达式。 唯一具有较低优先级的运算符是逻辑运算符“and”、“or”和“not”,它们可用于评估对列表运算符的调用,而无需额外的括号。
二进制“或”返回两个周围表达式的逻辑分离。 等价于
||
,除了非常低的优先级。 这使得它对控制流很有用
print FH $data or die "Can't write to FH: $!";
这意味着它是短路的:即,仅当左表达式为假时才对右表达式求值。 由于它的优先级,您可能应该避免将其用于分配,仅用于控制流。
$a = $b or $c; # Bug: this is wrong
($a = $b) or $c; # Really means this
$a = $b || $c; # Better written this way
但是,当它是列表上下文分配并且您尝试使用“||”时对于控制流,您可能需要“或”,以便分配具有更高的优先级。
@info = stat($file) || die; # Oops, scalar sense of stat!
@info = stat($file) or die; # Better, now @info gets its due
再说一次,你总是可以使用括号。
如果任何列表运算符(print() 等)或任何一元运算符(chdir() 等)后跟左括号作为下一个标记,则括号内的运算符和参数被认为具有最高优先级,只是就像一个普通的函数调用。
例如,因为命名的一元运算符比 || 具有更高的优先级:
chdir $foo || die; # (chdir $foo) || die
chdir($foo) || die; # (chdir $foo) || die
chdir ($foo) || die; # (chdir $foo) || die
chdir +($foo) || die; # (chdir $foo) || die
!
, &&
, ||
, 和^
具有高优先级,因此它们在构造表达式时很有用; not
、 and
、 or
和xor
具有低优先级,因此它们对于本质上不同的表达式之间的流控制很有用。
唯一的区别是它们的优先级。
open FILE, $file or die("cannot open $file"); # This works
open (FILE, $file) or die("cannot open $file"); # ...because it means this
open FILE, $file || die("cannot open $file"); # This doesn't work
open FILE, ($file || die("cannot open $file")); # ...because it means this
“&&”和“||” 运算符的优先级高于其对应的“and”、“or”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.