繁体   English   中英

"||" 和有什么不一样 Perl 中的“或”?

[英]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

! , && , || , 和^具有高优先级,因此它们在构造表达式时很有用; notandorxor具有低优先级,因此它们对于本质上不同的表达式之间的流控制很有用。

唯一的区别是它们的优先级。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM