Hashref / Arrayref, не понимаю следующее поведение - PullRequest
0 голосов
/ 14 мая 2019

У меня есть arrayref с hashrefs, структура выглядит следующим образом:

[
{
"id"   => 1,
"name" => "name1"
},
{
"id"   => 2,
"name" => "name2"
}
]

когда я хочу вставить хеш (без hashref) в этот массив, структура выглядит странно.

my %hash = (id => 3, name => "name3");
push(@$array, %hash);

структура будет выглядеть следующим образом:

[
{
"id"   => 1,
"name" => "name1"
},
{
"id"   => 2,
"name" => "name2"
}
"id"   => 3,
"name" => "name3"
]

, поэтому пары значений ключа помещаются в массив как отдельные значения, а не как хеш?когда я нажимаю \%hash, это работает.

push(@$array, \%hash);

но я действительно не понимаю, почему я получаю другую структуру объекта, так как ref просто означает, что это указатель на место хранения?

Заранее спасибо.

1 Ответ

3 голосов
/ 14 мая 2019

Вам нужно знать, что в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...