I am having issues appending data to an array of hashes. Instead of appendibg the data into the hash it is creating a new hash.
$json_data =
{
'site_data' =>
{
'urldata' =>
[
{
'URL' => "$filedata{'filename'}"
}
],
}
}
my %format =('Format'=>'ZIP');
push ($json_data->{'site_data'}->{'urldata'},\%format);
What I am expecting is.
'urldata':
[
{
'URL':"www.espn.com",
'Format':"ZIP"
}
],
What I am getting is.
'urldata':
[
{
'URL':"www.espn.com"
},
{
'Format':"ZIP"
}
],
答案 0 :(得分:5)
这里发生了一些事情。
首先,这种语法会引起问题:
push ($json_data->{'site_data'}->{'urldata'},\%format);
这使用了实验性功能,该功能已在Perl 5.14中添加,并在5.24中再次删除。所以请不要使用它。您需要显式地尊重您的数组引用(通过在表达式周围放置@{ ... }
。
push (@{ $json_data->{'site_data'}->{'urldata'} }, \%format);
但这并不能使您更接近。这使您可以在任何版本的Perl上使用相同的折断解决方案:-)
push()
函数仅适用于数组。在您的情况下,您正在将其用于存储在哈希的urldata
键中的数组(引用)上。但是,您不想在该数组上push()
一个新元素(因为这会给您当前所看到的错误结果)。您想访问存储在数组中的现有第一个哈希,并向其添加键/值对。
urldata
数组的第一个元素由以下给出:
$json_data->{'site_data'}->{'urldata'}->[0]; # The '0' gives the first element.
这是一个哈希引用,因此您可以使用与其他哈希引用完全相同的方式将值添加到哈希中。
$json_data->{'site_data'}->{'urldata'}->[0]->{'Format'} = 'ZIP';
当然,您可以通过删除哈希键周围的引号来整理代码:
$json_data->{site_data}->{urldata}->[0]->{Format} = 'ZIP';
并且分度括号之间的箭头始终是可选的:
$json_data->{site_data}{urldata}[0]{Format} = 'ZIP';