我在将数据附加到哈希数组时遇到问题。不是将数据附加到哈希中,而是创建一个新的哈希。
$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)
这里发生了一些事情。
首先,此语法会引起问题:
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)