这是这个问题的后续问题。
例如,假设我有三个过程,无论如何我都需要运行并在它们都返回 1 时退出。
while (&proc1 && &proc2 && &proc3);
因为 Perl 使用短路评估,代码可能会或可能不会执行 subs &proc2 和 &proc3 取决于前面的操作数(如果操作数为假,则不会执行以下操作数;更多信息here和on wiki)。如果需要,有什么方法可以关闭该功能?
您可以将每个子句评估为临时变量,然后评估整个表达式。例如,为了避免短路评估:
if ($x < 10 and $y < 100) { do_something(); }
写:
$first_requirement = ($x < 10);
$second_requirement = ($y < 100);
if ($first_requirement and $second_requirement) { do_something(); }
将评估两个条件。大概,您想要更复杂的具有副作用的条件,否则如果第一个条件为假,则没有理由评估第二个条件。
你可以写
until ( grep !$_, proc1(), proc2(), proc3() ) {
...
}
无论你做什么,都不应该使用 & 语法调用子例程,比如&proc1
. 这已经错了很多年,取而代之的是proc1()
您可以使用乘法运算符
while (&proc1 * &proc2 * &proc3) { ... }
这将评估所有三个操作数,如果其中任何一个为假(零),则评估为假。
如果您担心有关未初始化值的警告,您可以使用按位和与!!
cast-to-boolean 伪运算符:
while (!!&proc1 & !!&proc2 & !!&proc3) { ... }
这将做几乎相同的事情。强制转换为布尔值是必要的,因为两个任意真值的按位与结果可能仍然为假(例如,1 & 2
计算结果为0
)。
我不知道有什么方法可以禁用短路评估,但是您可以在循环体的开头评估每个组件,如果任何条件为假,则中断。
while (1) {
my $result1 = &proc1;
my $result2 = &proc2;
my $result3 = &proc3;
last unless ($result1 && $result2 && $result3);
...
}