在Perl中 - 如果需要,可以禁用短路评估吗?

Ana*_* Wu 2 optimization perl logic

这是一个后续问题这一个.

例如,假设我有三个程序需要运行,无论如何,如果所有程序都返回1则退出.

while (&proc1 && &proc2 && &proc3);
Run Code Online (Sandbox Code Playgroud)

因为Perl正在使用短路评估,所以代码可能会也可能不会执行subs&proc2和&proc3,具体取决于前面的操作数(如果操作数为false,则不会执行以下操作数; 此处wiki上的更多信息).如果需要,有没有办法关闭该功能?

Cha*_*lke 8

您可以只将每个子句计算为临时变量,然后计算整个表达式.例如,为了避免在以下方面进行短路评估:

if ($x < 10 and $y < 100) { do_something(); }
Run Code Online (Sandbox Code Playgroud)

写:

$first_requirement = ($x < 10);
$second_requirement = ($y < 100);
if ($first_requirement and $second_requirement) { do_something(); }
Run Code Online (Sandbox Code Playgroud)

将评估两个条件.据推测,您需要更复杂的副作用条件,否则如果第一个条件为假,则没有理由评估第二个条件.

  • 对于这一点,我没有看到任何不以perl为中心的东西.如果有什么它更清楚. (2认同)

Bor*_*din 5

你可以写

until ( grep !$_, proc1(), proc2(), proc3() ) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

无论你做什么,你都不应该使用和号语法来调用子程序,比如&proc1.多年来一直是错误的,取而代之的是proc1()