2

这是这个问题的后续问题。

例如,假设我有三个过程,无论如何我都需要运行并在它们都返回 1 时退出。

while (&proc1 && &proc2 && &proc3);

因为 Perl 使用短路评估,代码可能会或可能不会执行 subs &proc2 和 &proc3 取决于前面的操作数(如果操作数为假,则不会执行以下操作数;更多信息hereon wiki)。如果需要,有什么方法可以关闭该功能?

4

4 回答 4

8

您可以将每个子句评估为临时变量,然后评估整个表达式。例如,为了避免短路评估:

if ($x < 10 and $y < 100) { do_something(); }

写:

$first_requirement = ($x < 10);
$second_requirement = ($y < 100);
if ($first_requirement and $second_requirement) { do_something(); }

将评估两个条件。大概,您想要更复杂的具有副作用的条件,否则如果第一个条件为假,则没有理由评估第二个条件。

于 2013-06-18T20:53:42.347 回答
5

你可以写

until ( grep !$_, proc1(), proc2(), proc3() ) {
  ...
}

无论你做什么,都不应该使用 & 语法调用子例程,比如&proc1. 这已经错了很多年,取而代之的是proc1()

于 2013-06-18T23:01:46.870 回答
3

您可以使用乘法运算符

while (&proc1 * &proc2 * &proc3) { ... }

这将评估所有三个操作数,如果其中任何一个为假(零),则评估为假。

如果您担心有关未初始化值的警告,您可以使用按位和与!!cast-to-boolean 伪运算符:

while (!!&proc1 & !!&proc2 & !!&proc3) { ... }

这将做几乎相同的事情。强制转换为布尔值是必要的,因为两个任意真值的按位与结果可能仍然为假(例如,1 & 2计算结果为0)。

于 2013-06-18T22:00:49.210 回答
1

我不知道有什么方法可以禁用短路评估,但是您可以在循环体的开头评估每个组件,如果任何条件为假,则中断。

while (1) {
    my $result1 = &proc1;
    my $result2 = &proc2;
    my $result3 = &proc3;
    last unless ($result1 && $result2 && $result3);
    ...
}
于 2013-06-18T23:36:04.230 回答