如果答案已经确定,Perl是否已优化以跳过剩余的逻辑操作数?

时间:2013-06-18 20:23:52

标签: perl optimization logic

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

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

如果第一个括号为假,那么Perl会评估第一个括号和第二个括号,无论它在第二个括号的评估中停止了什么或者它会停止吗?

后续问题here。 (我不知道是否应该提出新问题或在此发布)

6 个答案:

答案 0 :(得分:7)

是。此行为通常用于idiomatic perl。

考虑:

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

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

答案 1 :(得分:4)

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

say "foo" if $bar;

相同
$bar and say "foo";

if ($cond) { stuff() }

相同
$cond and do { stuff() }

然而,if的整个条件必须包含在parens中,以此作为例子

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

是。此行为在perlop documentation中被称为短路(强调添加)。

  

C风格的逻辑和

     

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

     

C风格的逻辑或

     

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

&&||之外,其优先级较低的同类andor也会短路。

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

答案 4 :(得分:2)

这将是

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

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

答案 5 :(得分:2)

不,当左侧部分为false

时,不评估条件的正确部分
if ($do eq 'b' && /text/)
{
do stuff
}