4

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

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

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

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

4

6 回答 6

7

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

考虑:

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

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

于 2013-06-18T20:25:53.457 回答
4

是的,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,但优先级更高)

于 2013-06-18T20:27:30.493 回答
4

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

于 2013-06-18T20:28:12.750 回答
4

是的。这种行为在perlop 文档中称为短路(添加了重点)。

C 风格的逻辑与

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

C 风格的逻辑或

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

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

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

于 2013-06-18T20:32:21.033 回答
2

这将是

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

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

于 2013-06-18T20:26:17.383 回答
2

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

if ($do eq 'b' && /text/)
{
do stuff
}
于 2013-06-18T20:26:35.463 回答