Продвиньте к ссылке на массив

Действительно ли возможно push к ссылке на массив в Perl? Поиск с помощью Google предложил меня отсрочка массив сначала, но это действительно не работает. Это продвигает к массиву deferenced, не массиву, на который ссылаются.

Например,

my @a = ();

my $a_ref = [@a];

push(@$a_ref,"hello");

print $a[0];

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

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

31
задан Despertar 20 June 2014 в 13:41
поделиться

3 ответа

Было бы полезно думать об адресах памяти, а не об именах переменных.

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.
47
ответ дан 27 November 2019 в 22:12
поделиться

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

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

3
ответ дан 27 November 2019 в 22:12
поделиться

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

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

1
ответ дан 27 November 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: