如何将数据添加到哈希引用

use*_*290 0 perl

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

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

我期望的是。

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

 ],
Run Code Online (Sandbox Code Playgroud)

我得到的是。

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

 ],
Run Code Online (Sandbox Code Playgroud)

Dav*_*oss 5

这里发生了一些事情。

首先,此语法会引起问题:

push ($json_data->{'site_data'}->{'urldata'},\%format);
Run Code Online (Sandbox Code Playgroud)

这使用了实验性功能,该功能已在Perl 5.14中添加,并在5.24中再次删除。所以请不要使用它。您需要显式地引用数组引用(通过放置@{ ... }表达式。

push (@{ $json_data->{'site_data'}->{'urldata'} }, \%format);
Run Code Online (Sandbox Code Playgroud)

但这并不能使您更接近。这使您可以在任何版本的Perl上使用相同的折断解决方案:-)

push()函数仅适用于数组。在您的情况下,您正在存储在urldata哈希键中的数组(引用)上使用它。但是您不希望push()在该数组上添加新元素(因为这样会给您当前所看到的错误结果)。您要访问存储在数组中的现有第一个哈希,然后向其添加键/值对。

urldata数组的第一个元素由下式给出:

$json_data->{'site_data'}->{'urldata'}->[0]; # The '0' gives the first element.
Run Code Online (Sandbox Code Playgroud)

那是一个哈希引用,因此您可以使用与其他哈希引用完全相同的方式将值添加到哈希中。

$json_data->{'site_data'}->{'urldata'}->[0]->{'Format'} = 'ZIP';
Run Code Online (Sandbox Code Playgroud)

当然,您可以通过删除哈希键周围的引号来整理代码:

$json_data->{site_data}->{urldata}->[0]->{Format} = 'ZIP';
Run Code Online (Sandbox Code Playgroud)

索引括号之间的箭头始终是可选的:

$json_data->{site_data}{urldata}[0]{Format} = 'ZIP';
Run Code Online (Sandbox Code Playgroud)

  • @ user3525290有关引用哈希键的规则与子例程名称和粗逗号“ =>”之前引用的规则相同。您不必引用任何有效的标识符,该标识符是仅由字母,数字和下划线组成的裸词,并且不以数字开头(unicode字母和数字在`use utf8`中有效)。如果它包含任何其他字符,则需要用引号引起来。 (2认同)