我有一个带有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
仅表示它是指向存储位置的指针?
谢谢。
答案 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;