Во-первых, имейте в виду, что Perl проходит по ссылке.Это означает, что
sum(++$x, ++$x)
в основном совпадает с
do {
local @_;
alias $_[0] = ++$x;
alias $_[1] = ++$x;
∑
}
Предварительное увеличение возвращает саму переменную, а не ее копию *, так что это означает и $_[0]
, и $_[1]
имеют псевдоним $x
.Поэтому sum
видит текущее значение $x
(2
) для обоих аргументов.
Правило: не изменяйте и не читайте значение в одном выражении.
* - Это не задокументировано, но вы спрашиваете, почему Perl ведет себя так, как он.