Я пытаюсь выяснить подпрограммы Perl и как они работают.
Из perlsub Я понимаю, что подпрограммы являются "позывным" и что назначение (например, my(@copy) = @_;
) необходимо, чтобы превратить их в вызов -по-значение.
В дальнейшем я вижу, что change
вызывается по ссылке, потому что "a" и "b" меняются на "x" и "y". Но я смущен тем, почему массив не расширен с дополнительным элементом "z"?
use strict;
use Data::Dumper;
my @a = ( "a" ,"b" );
change(@a);
print Dumper(\@a);
sub change
{
@_[0] = "x";
@_[1] = "y";
@_[2] = "z";
}
Вывод:
$VAR1 = [
'x',
'y'
];
Далее я передаю хеш вместо массива. Почему ключ не изменился с "a" на "x"?
use strict;
use Data::Dumper;
my %a = ( "a" => "b" );
change(%a);
print Dumper(\%a);
sub change
{
@_[0] = "x";
@_[1] = "y";
}
Вывод:
$VAR1 = {
'a' => 'y'
};
Я знаю, что реальное решение состоит в передаче массива или хэша по ссылке с помощью \@
, но я хотел бы точно понять поведение этих программ.