Я пытаюсь понять подпрограммы Perl и как они работают.
Из perlsub я понимаю, что подпрограммы вызываются по ссылке и что требуется присвоение (например, my (@copy) = @_;
), чтобы превратить их в вызовы по ссылке. значение.
Далее я вижу, что изменение
вызывается по ссылке, потому что «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'
};
Я знаю, что реальное решение - передать массив или хэш по ссылке, используя \ @
, но я хотел бы точно понять поведение этих программ.