Нажмите для ссылки на массив - PullRequest
31 голосов
/ 16 июня 2010

Возможно ли push ссылка на массив в Perl?Googling предложил сначала почитать массив, но на самом деле это не работает.Он выдвигается к массиву, на который имеется ссылка, а не к указанному массиву.

Например,

my @a = ();

my $a_ref = [@a];

push(@$a_ref,"hello");

print $a[0];

@a не будет обновлен, и этот код не будет выполнен, поскольку массив все еще пуст

(Я все еще изучаю ссылки на Perl, так что это может быть невероятно простой вопрос. Извините, если так)

Ответы [ 4 ]

47 голосов
/ 16 июня 2010

Это может помочь в терминах адресов памяти, а не имен переменных.

my @a = ();       # Set aside memory address 123 for a list.

my $a_ref = [@a]; # Square brackets set aside memory address 456.
                  # @a COPIES the stuff from address 123 to 456.

push(@$a_ref,"hello"); # Push a string into address 456.

print $a[0]; # Print address 123.

Строка вошла в другое место в памяти.

Вместо этого укажите переменную $a_ref в ячейке памяти списка @a. push влияет на ячейку памяти 123. Поскольку @a также относится к ячейке памяти 123, ее значение также изменяется.

my $a_ref = \@a;       # Point $a_ref to address 123. 
push(@$a_ref,"hello"); # Push a string into address 123.
print $a[0];           # Print address 123.
7 голосов
/ 20 июня 2014

Вы можете вставить непосредственно в массив ref без ссылки.

my $arrayRef = [];
push $arrayRef, "one";
push $arrayRef, "two";
print @$arrayRef;

Выходы

onetwo

Документация: http://perldoc.perl.org/functions/push.html

Начиная с Perl 5.14, push может принимать скалярный EXPR, который должен содержать ссылка на необъявленный массив.

До 5.14 вы должны сначала разыменовать массив ref.

push @$arrayRef, "item";

Редактировать: в недавнем выпуске perl устаревание Annnnd непосредственно для ссылки на массив не рекомендуется (5.24?) Учитывая это, было бы безопаснее всегда разыменовывать @ {$ arrayRef}, прежде чем пытаться увеличить совместимость вашего кода.

3 голосов
/ 16 июня 2010

$a не равно $a_ref, ($a - первая переменная сравнения, присвоенная sort{}, а $a[0] - 0-й элемент массива @a). Никогда не используйте $a, или $b вне подпрограммы пользовательской сортировки, и, вероятно, следует также избегать использования массивов @a и @b (существует множество лучших вариантов) ...

То, что вы делаете - это присваиваете $a_ref анонимный массив, а затем нажимаете на него "hello", но распечатываете первый элемент массива @a.

1 голос
/ 20 июня 2010

Да, это возможно.Это работает для меня.

my @a = (); 
my $aref = \@a; # creates a reference to the array a

push(@$aref, "somevalue"); # dereference $aref and push somevalue in it

print $a[0]; # print the just pushed value, again @$aref[0] should also work

Как уже упоминалось, $aref = [@a] будет копировать, а не создавать ссылку на

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