Я всегда был уверен, что если я передам подпрограмму Perl простой скаляр, он никогда не сможет изменить свое значение вне подпрограммы. То есть:
my $x = 100;
foo($x);
# without knowing anything about foo(), I'm sure $x still == 100
Итак, если я хочу foo()
изменить x
, я должен передать ему ссылку на x
.
Тогда я узнал, что это не так:
sub foo {
$_[0] = 'CHANGED!';
}
my $x = 100;
foo($x);
print $x, "\n"; # prints 'CHANGED!'
И то же самое относится к элементам массива:
my @arr = (1,2,3);
print $arr[0], "\n"; # prints '1'
foo($arr[0]);
print $arr[0], "\n"; # prints 'CHANGED!'
Это меня удивило. Как это работает? Разве только подпрограмма получает значение аргумента? Как узнать его адрес?