Ссылка на массив
Возможно ли push
ссылаться на массив в Perl? Googling предложил мне сначала отнестись к массиву, но на самом деле это не работает. Он подталкивает к отложенному массиву, а не к ссылочному массиву.
Например,
my @a = ();
my $a_ref = [@a];
push(@$a_ref,"hello");
print $a[0];
@a
не будет обновляться, и этот код завершится неудачно, потому что массив все еще пуст.
(Я все еще изучаю ссылки на Perl, так что это может быть невероятно простой вопрос. Извините, если так)
Ответы
Ответ 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]
будет копировать и не создавать ссылку на