我正在从命令行运行这个单行程序:
perl -MList::Util=sum -E 'my $x = 0; say sum(++$x, ++$x)'
为什么会说"4"
而不是"3"
?
答案 0 :(得分:7)
首先,请记住Perl通过引用传递。这意味着
sum(++$x, ++$x)
与
基本相同do {
local @_;
alias $_[0] = ++$x;
alias $_[1] = ++$x;
∑
}
预增量返回变量本身而不是它的副本*,这意味着$_[0]
和$_[1]
都别名为$x
。因此,sum
会看到两个参数的$x
(2
)的当前值。
经验法则:不要在同一语句中修改和读取值。
* - 这没有记录,但你会问为什么Perl的行为方式如此。
答案 1 :(得分:4)
您正在同一语句中修改$x
两次。根据{{3}},Perl不保证这些陈述的结果是什么。所以它可能是"2"
或"0"
。
答案 2 :(得分:3)
因为在计算总和之前执行了两个增量器。
执行后,x = 2
。
2 + 2 = 4.