【问题标题】:Is Perl optimized to skip remaining logic operands if the answer is already decided?如果答案已经确定,Perl 是否已优化以跳过剩余的逻辑操作数?
【发布时间】:2013-06-18 20:23:51
【问题描述】:

例如,如果$do eq 'b',我需要匹配一些文本。 如果我运行这段代码:

if (($do eq 'b') && (/text/))
{
do stuff
}

无论如何,perl 是否会评估第一个括号和第二个括号,或者如果第一个括号为假,它会停止对第二个括号的评估?

后续问题here。 (我不知道我应该提出一个新问题还是在这里发布)

【问题讨论】:

  • 要搜索的关键字是“短路评估”。
  • 这不是优化,而是相当重要的行为。
  • @AJMansfield 知道它以某种方式被调用,但我就是不记得了。谢谢你把它还给我。 :)
  • @delnan 我现在明白了。 :)
  • 它不是 Perl 特有的,all common programming language have it 的形式可能略有不同。

标签: perl optimization logic


【解决方案1】:

是的。这种行为在惯用的 perl 中很常见。

考虑:

open FILE, ">$fname" or die $!;

如果打开文件没有错误(open 返回 true),则不会执行 die 语句。这不是对die 例程的特殊处理;这正是 perl 处理逻辑评估的方式。

【讨论】:

  • 哇,太酷了,我从没想到这就是我一直在使用的or die 语句背后的逻辑......非常感谢您接受是时候解释一下了,谢弗先生。
【解决方案2】:

是的,Perl 短路了逻辑运算符。这意味着它们可以用于控制流:

say "foo" if $bar;

相同
$bar and say "foo";

if ($cond) { stuff() }

相同
$cond and do { stuff() }

但是,if 的整个条件必须用括号括起来,以作为示例

if ($do eq 'b' && /text/) {
  do stuff;
}

&&and相同,但优先级更高)

【讨论】:

  • 因为它实际上不是问题的重点,所以我修复了问题中的语法
【解决方案3】:

简短的回答:它会停止(AJ 指出“短路”)。您可以获得更多详细信息here

【讨论】:

    【解决方案4】:

    是的。这种行为在perlop documentation 中被称为短路(强调)。

    C 风格的逻辑与

    二进制&& 执行短路 逻辑与运算。也就是说,如果左操作数为假,则甚至不计算右操作数。如果计算,标量或列表上下文会向下传播到正确的操作数。

    C 风格的逻辑或

    二进制|| 执行短路 逻辑或运算。也就是说,如果左操作数为真,则甚至不计算右操作数。如果计算,标量或列表上下文会向下传播到正确的操作数。

    除了&&||,它们的低优先级表亲andor 也短路了。

    Perl 有一个xor 运算符,但由于exclusive-or 的定义,它不能短路。

    【讨论】:

      【解决方案5】:

      应该是

      if ($do eq 'b' && /text/) {
          do stuff
      }
      

      是 - 如果 $do eq 'b' 为 false,则不会评估 /text/

      【讨论】:

        【解决方案6】:

        不,当左侧部分为false 时,不评估条件的右侧部分,

        if ($do eq 'b' && /text/)
        {
        do stuff
        }
        

        【讨论】:

        • 我知道你的意思,但你描述的短路匹配or。相反,and 在第一个操作数为假时短路。
        猜你喜欢
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 2019-10-13
        • 2020-03-10
        • 2014-07-23
        • 2012-10-10
        • 2022-07-28
        • 2016-12-31
        相关资源
        最近更新 更多