为什么Perl会在递增后打印出一个我不期望的值?

时间:2011-08-05 21:02:35

标签: perl

我正在从命令行运行这个单行程序:

perl -MList::Util=sum -E 'my $x = 0; say sum(++$x, ++$x)'

为什么会说"4"而不是"3"

3 个答案:

答案 0 :(得分:7)

首先,请记住Perl通过引用传递。这意味着

sum(++$x, ++$x)

基本相同
do {
   local @_;
   alias $_[0] = ++$x;
   alias $_[1] = ++$x;
   ∑
}

预增量返回变量本身而不是它的副本*,这意味着$_[0]$_[1]都别名为$x。因此,sum会看到两个参数的$x2)的当前值。

经验法则:不要在同一语句中修改和读取值。

* - 这没有记录,但你会问为什么Perl的行为方式如此。

答案 1 :(得分:4)

您正在同一语句中修改$x两次。根据{{​​3}},Perl不保证这些陈述的结果是什么。所以它可能是"2""0"

答案 2 :(得分:3)

因为在计算总和之前执行了两个增量器。

执行后,x = 2

2 + 2 = 4.