Действительно ли возможно push
к ссылке на массив в Perl? Поиск с помощью Google предложил меня отсрочка массив сначала, но это действительно не работает. Это продвигает к массиву deferenced, не массиву, на который ссылаются.
Например,
my @a = ();
my $a_ref = [@a];
push(@$a_ref,"hello");
print $a[0];
@a
не будет обновлен и этот код перестанет работать, потому что массив все еще пуст
(Я все еще изучаю ссылки Perl, таким образом, это могло бы быть невероятно простым вопросом. Извините раз так)
Было бы полезно думать об адресах памяти, а не об именах переменных.
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.
$ a
не является $ a_ref
, ( $ a
- первая переменная сравнения, присвоенная сортировке {}
и $ a [0]
- 0-й элемент массива @a
). Никогда не используйте $ a
или $ b
вне пользовательской сортировки подпрограммы, а массив @a
и @b
, вероятно, тоже следует избегать (есть много лучших вариантов) ...
Вы назначаете $ a_ref
, анонимный массив, а затем нажатие на него "привет"
, но распечатка первого элемента массива @a
.
Да, это возможно. У меня это работает.
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]
будет копировать, а не создавать ссылку на