首页 > 解决方案 > Perl 方程中的 shift 执行顺序

问题描述

为了演示我的问题,请考虑以下 Perl 代码:

use strict;
use warnings;
use Data::Dumper;

my @a = (1, 2);
my %h;

sub test {
  $h{shift @_} = shift;
}

&test(@a);
print Dumper(%h);

输出如下

$VAR1 = '2';

$VAR2 = 1;


shift为什么 Perl从等式右侧执行第一个,而不是从左侧执行?

为什么输出如下?

$VAR1 = '1';

$VAR2 = 2;

标签: perl

解决方案


在大多数语言中,对于大多数运算符来说,操作数的求值顺序是未定义的或至少是未记录的。[1] Perl 也不例外。

f() + g()打电话f()还是g()先?好吧,那是未记录的,可能是未定义的。


现在,事实证明,perl目前非常一致。二元算术运算符将始终在其右侧操作数之前评估其左侧操作数(包括**右结合运算符),而标量赋值运算符和列表赋值运算符将在其 LHS 操作数之前评估其 RHS 操作数。


  1. 值得注意的例外包括标量上下文中的逗号运算符和短路运算符。

    标量上下文中的逗号运算符被记录为在其 RHS 之前评估其 LHS,尽管在列表上下文中调用它时没有这样的保证。

    短路运算符——即&&, ||,andor条件运算符——必须在任何其他操作数之前计算它们的 LHS。


推荐阅读