Подтвердить что ты не робот

Ссылка на массив

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

Например,

my @a = ();

my $a_ref = [@a];

push(@$a_ref,"hello");

print $a[0];

@a не будет обновляться, и этот код завершится неудачно, потому что массив все еще пуст.

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

4b9b3361

Ответ 1

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

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.

Ответ 2

Вы можете нажать прямо на массив 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";

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

Ответ 3

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

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

Ответ 4

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

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] будет копировать и не создавать ссылку на