Я новичок в Перле. Я понимаю, что my @a = ();
эквивалентно my @a;
-- оба инициализируют пустой массив. Точно так же my $a = [];
инициализирует пустой массив, на который ссылается $a
.
Однако меня смущает my @arr = [];
, который также является легальным Perl. Согласно ref()
и print
, @arr
— это массив, а не ссылка на него. Его можно нажать, что, кажется, возвращает количество элементов в массиве. Но, похоже, он содержит ссылку на другой массив, который также можно вставить:
#!/usr/bin/perl
use v5.16;
my @arr = [];
push(@arr, 1);
print join(", ", @arr) . "\n";
push(@arr[0], 11);
push(@arr[0], 12);
print "a[0]: " . join(", ", @{@arr[0]}) . "\n";
Выходы
ARRAY(0xd6ede8), 1
a[0]: 11, 12
Что здесь происходит? Детали очень ценятся.
use strict
иuse warnings
в начале каждой программы Perl. В этом случае последний предупредил бы васScalar value @arr[0] better written as $arr[0]
. В более поздних версиях Perl допустимо помещать в массив references, и первый элемент@arr
является ссылкой. Для явного доступа к массиву вы должны написать@{ $arr[0] }
. - person Borodin   schedule 07.03.2014[ ... ]
примерно эквивалентноdo { my @anon = ( ... ); \@anon }
. Он возвращает ссылку, а ссылки являются скалярами и, следовательно, допустимыми значениями для элементов массива. - person ikegami   schedule 07.03.2014