How to add data to a hash reference

时间:2019-05-31 11:30:34

标签: perl

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"
    }

 ],

1 个答案:

答案 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';