Подпрограммы Perl вызываются по ссылке или по значению?

Я пытаюсь понять подпрограммы 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'
};

Я знаю, что реальное решение - передать массив или хэш по ссылке, используя \ @ , но я хотел бы точно понять поведение этих программ.

28
задан ThisSuitIsBlackNot 6 January 2016 в 20:51
поделиться