Странное поведение ссылок Perl - PullRequest
0 голосов
/ 06 августа 2011

Посмотрите на этот кусок кода:

my @arr = (1, 2);
my $ref = \@arr;
my @s = @$ref;
push @s, 4;
print join(", ", @arr) . "\n";

Неожиданно выводится «1, 2». Что случилось? Почему я получил два разных массива (@s is (1,2,4))?

Конечно, я получаю «1, 2, 4», если пишу перед выводом, что-то вроде этого:

$ref = \@s;
@arr = @$ref;

Но это кажется довольно неуклюжим.

Я привык к другим языкам ООП, в которых такого не произошло бы - объект может быть изменен независимо от его ссылок.

Так может кто-нибудь, пожалуйста, помогите мне с этим?

1 Ответ

2 голосов
/ 06 августа 2011
my @s = @$ref;

делает копию ссылочного массива. После этого @s и @arr - это несвязанные массивы, которые случайно имеют одно и то же содержимое (некоторое время).

Если вы хотите изменить ссылочный массив, вы должны использовать его напрямую, например ::

push @$ref, 4;

Также есть модуль Data :: Alias ​​, который (я думаю) позволяет вам делать то, что вы просите. Но там задействована глубокая магия, и я никогда не использовал ее сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...