Вам нужно знать, что в Perl нет многомерных структур данных. И это в значительной степени относится к всем языкам, они просто абстрагируют проблему по-разному.
Вы получаете массив (или хэш) ссылок на подмассивы (или хэши).
Таким образом, если вы попытаетесь вставить хеш в массив, он сначала оценивается в контексте списка - пары ключ / значение выбрасываются в случайном порядке, а затем вставляются как элементы массива в массив.
Если вы хотите иметь хэш в качестве подэлемента массива, вы должны сделать это по ссылке - хотя есть несколько механизмов, с помощью которых вы можете сделать это тонко.
например:.
push ( @$array, {%hash} );
Оценка хеш-функции будет представлять собой список пар ключ-значение в списке, но тогда {}
действует как конструктор для анонимного хеш-кода, который затем вставляется в массив.
Он по-прежнему делает то же самое, что и в вашем примере, массив содержит элемент hash-ref, это просто анонимный элемент, который копирует ваш %hash
вместо ссылки на оригинал.
use Data::Dumper;
my $array = [];
my %hash = (id => 3, name => "name3");
push @$array, \%hash;
#note how these are the same ref number
print $array->[0],"\n";
print \%hash;
print Dumper $array;
print "\n";
#empty array;
$array = [];
push(@$array, {%hash});
#note different number.
print \%hash,"\n";
print $array->[0],"\n";
print Dumper $array;