Hashref / Arrayref,不了解以下行为

时间:2019-05-14 08:59:18

标签: perl

我有一个带有hashrefs的arrayref,其结构如下所示:

[
{
"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 个答案:

答案 0 :(得分:3)

您需要了解的事情是,在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;