【问题标题】:What is the difference between "||" and "or" in Perl?"||" 和有什么不一样和 Perl 中的“或”?
【发布时间】:2010-11-11 07:36:21
【问题描述】:

C 风格的运算符&&||、...和它们的 Perl 人类可读版本“and”、“or”、...之间有什么区别?

似乎互联网代码同时使用了它们:

open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");

【问题讨论】:

  • 查看perldoc perlop 以获得良好的优先级图表,并查看“逻辑或”部分以获得更多示例:perldoc.perl.org/…
  • 另外,使用词法文件句柄和 open 的三参数形式。在 die 的参数中包含系统返回的错误:open my $file_h, '<', $file or die "Cannot open '$file': $!";

标签: perl operators


【解决方案1】:

来自Perl documentation

列出运算符

在列表运算符的右侧,它的优先级非常低,因此它控制在那里找到的所有逗号分隔的表达式。唯一具有较低优先级的运算符是逻辑运算符“and”、“or”和“not”,它们可用于评估对列表运算符的调用,而无需额外的括号。

逻辑or,定义or,排他or

二进制“或”返回两个周围表达式的逻辑析取。它相当于||,除了非常低的优先级。这使得它对控制流很有用

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

【讨论】:

  • 接受的答案,因为它比 Dave Hinton 的更完整
【解决方案2】:

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

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

【讨论】:

  • 优先级与什么比较?逗号运算符?
  • 与列表运算符相比的优先级。我希望我的编辑能让事情更清楚。
【解决方案3】:

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

【讨论】:

  • 我更喜欢这个答案,而不是公认的答案,它更短,并为您提供所需的答案。
【解决方案4】:

“&&”和“||”运算符的优先级高于它们的“and”、“or”对应项。

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 2014-09-13
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2022-01-15
    • 2021-11-29
    • 2011-08-16
    相关资源
    最近更新 更多