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

pla*_*etp 5 perl

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

perl -MList::Util=sum -E 'my $x = 0; say sum(++$x, ++$x)'
Run Code Online (Sandbox Code Playgroud)

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

ike*_*ami 7

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

sum(++$x, ++$x)
Run Code Online (Sandbox Code Playgroud)

基本上是一样的

do {
   local @_;
   alias $_[0] = ++$x;
   alias $_[1] = ++$x;
   ∑
}
Run Code Online (Sandbox Code Playgroud)

预增量返回变量本身,而不是它的一个副本*,因此,这意味着这两个$_[0]$_[1]的别名$x.因此,sum查看两个参数的当前值$x(2).

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

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


Eug*_*ash 4

$x您在同一条语句中修改了两次。根据文档,Perl 不会保证该语句的结果是什么。所以很可能是"2""0"