首页 > 解决方案 > 如何将数据添加到哈希引用

问题描述

我在将数据附加到哈希数组时遇到问题。它不是将数据附加到哈希中,而是创建一个新的哈希。

$json_data = 
{
    'site_data' =>
     {
        'urldata' =>
        [
            {
                'URL' => "$filedata{'filename'}"
            }
        ],
    }
}
my %format =('Format'=>'ZIP');
push ($json_data->{'site_data'}->{'urldata'},\%format);

我期待的是。

'urldata':
 [
    {
        'URL':"www.espn.com",
        'Format':"ZIP"
    }

 ],

我得到的是。

'urldata':
 [
    {
        'URL':"www.espn.com"
    },
    {
        'Format':"ZIP"
    }

 ],

标签: perl

解决方案


这里发生了一些事情。

首先,这种语法会导致问题:

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

推荐阅读