例如,我需要匹配一些文本 if $do eq 'b'
。如果我运行此代码:
if (($do eq 'b') && (/text/))
{
do stuff
}
无论如何,perl 是否会评估第一个括号和第二个括号,或者如果第一个括号为假,它会在评估第二个括号时停止吗?
后续问题在这里。(我不知道我是否应该提出一个新问题或在这里发布)
例如,我需要匹配一些文本 if $do eq 'b'
。如果我运行此代码:
if (($do eq 'b') && (/text/))
{
do stuff
}
无论如何,perl 是否会评估第一个括号和第二个括号,或者如果第一个括号为假,它会在评估第二个括号时停止吗?
后续问题在这里。(我不知道我是否应该提出一个新问题或在这里发布)
是的。这种行为通常用在惯用的 perl 中。
考虑:
open FILE, ">$fname" or die $!;
如果打开文件没有错误(open
返回 true),die
则不执行该语句。这不是die
套路的特殊处理;这正是 perl 处理逻辑评估的方式。
是的,Perl 短路了逻辑运算符。这意味着它们可以用于控制流:
say "foo" if $bar;
是相同的
$bar and say "foo";
和
if ($cond) { stuff() }
是相同的
$cond and do { stuff() }
但是,必须将 an 的整个条件if
包裹在括号中,使您的示例
if ($do eq 'b' && /text/) {
do stuff;
}
(&&
与 相同and
,但优先级更高)
简短的回答:它停止(AJ 指出的“短路”)。你可以在这里得到更多的细节。
是的。这种行为在perlop 文档中称为短路(添加了重点)。
C 风格的逻辑与
二进制
&&
执行短路逻辑与运算。也就是说,如果左操作数为假,则甚至不计算右操作数。如果计算,标量或列表上下文会向下传播到正确的操作数。C 风格的逻辑或
二进制
||
执行短路逻辑或运算。也就是说,如果左操作数为真,则甚至不计算右操作数。如果计算,标量或列表上下文会向下传播到正确的操作数。
除了&&
和||
它们的优先级较低的表亲and
,or
还短路。
Perl 有一个运算符,但由于异或xor
的定义,它不能短路。
这将是
if ($do eq 'b' && /text/) {
do stuff
}
是 - 如果$do eq 'b'
为假,/text/
则不会被评估。
不,当左侧部分为 时,不评估条件的右侧部分false
,
if ($do eq 'b' && /text/)
{
do stuff
}