如果答案已经确定,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
语句背后的逻辑。。。非常感谢你花时间解释这一点,沙弗先生。因为这实际上不是问题的重点,所以我修正了问题的语法