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

如果答案已经确定,Perl是否优化为跳过剩余的逻辑操作数?,perl,optimization,logic,Perl,Optimization,Logic,例如,如果$do eq'b',我需要匹配一些文本。 如果我运行此代码: if (($do eq 'b') && (/text/)) { do stuff } perl会对第一个括号和第二个括号进行求值吗?如果第一个括号为false,它会在第二个括号求值时停止吗 跟进问题。(我不知道我是否应该提出一个新问题或在这里发布)是的。这种行为通常在惯用perl中使用 考虑: open FILE, ">$fname" or die $!; 如果打开文件时没有错误(open返回tru

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

if (($do eq 'b') && (/text/))
{
do stuff
}
perl会对第一个括号和第二个括号进行求值吗?如果第一个括号为false,它会在第二个括号求值时停止吗


跟进问题。(我不知道我是否应该提出一个新问题或在这里发布)

是的。这种行为通常在惯用perl中使用

考虑:

open FILE, ">$fname" or die $!;
如果打开文件时没有错误(
open
返回true),则不会执行
die
语句。这不是
模具的特殊处理
程序;这正是perl处理逻辑求值的方式。

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

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

否,当左侧为
false时,不会计算条件的右侧部分

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

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

say "foo" if $bar;

$bar and say "foo";
$cond and do { stuff() }

$bar and say "foo";
$cond and do { stuff() }
然而,
if
的整个条件必须用paren包装,这就是您的例子

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

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

简短回答:它停止(“短路”如AJ所指出)。你可以得到更多的细节。

是的。此行为在中称为短路(强调已添加)

C风格逻辑与逻辑 二进制
和&
执行短路逻辑与运算。也就是说,如果左操作数为false,则不计算右操作数。如果对标量或列表上下文求值,它将向下传播到右操作数

C型逻辑Or 二进制
|
执行短路逻辑或操作。也就是说,如果左操作数为真,则不计算右操作数。如果对标量或列表上下文求值,它将向下传播到右操作数

除了
&&
|
之外,他们的低优先级近亲
也短路


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

要搜索的关键字是“短路评估”。这不是一个优化,这是一个相当重要的行为。@AJMansfield知道它是以某种方式调用的,但我就是记不起来了。谢谢你把它还给我。:)@德尔南:我现在明白了。:)它并不特定于Perl,形式可能略有不同。我知道您的意思,但您描述的短路匹配
。相反,
在第一个操作数为false时短路。哇,太酷了,我从来没有想到这就是我一直在使用的
或die
语句背后的逻辑。。。非常感谢你花时间解释这一点,沙弗先生。因为这实际上不是问题的重点,所以我修正了问题的语法