如何在不覆盖早期值的情况下正确地将引用的哈希添加到数据结构中



我正在使用Perl JSON模块将Perl哈希转换为JSON字符串。 我不知道如何在保持之前分配的键和值的同时向哈希数组添加新哈希。

我正在尝试创建以下 JSON:

{
  "key1":"value1",
  "key2":"value2",
  "arrayOfHash":[
    {
      "key1-1":"value1-1",
      "key1-2":"value1-2"
    },
    {
      "key2-1":"value2-1",
      "key2-2":"value2-2"
    }
  ]
} 

这是代码:

use JSON; # imports encode_json, decode_json, to_json and from_json.
$json{key1}   = "value1";
$json{key2}   = "value2";
%hash             = ();
$hash{'key1-1'}   = "value1-1";
$hash{'key1-2'}   = "value1-2";
push(@{ $json{arrayOfHash} }, %hash);
%hash             = ();
$hash{'key2-1'}   = "value2-1";
$hash{'key2-2'}   = "value2-2";
push(@{ $json{arrayOfHash} }, %hash);
$json = encode_json(%json);

我得到的是:

{
  "key1":"value1",
  "key2":"value2",
  "arrayOfHash":[
    {
      "key2-1":"value2-1",
      "key2-2":"value2-2"
    },
    {
      "key2-1":"value2-1",
      "key2-2":"value2-2"
    }
  ]
} 

问题是%hash每次都引用相同的哈希值 - 当你说

%hash = ();

您不是在创建新的哈希,而只是在清空该哈希。这里有两种方法可以做你想做的事。首先,您可以从一开始就使用显式哈希引用:

use JSON; # imports encode_json, decode_json, to_json and from_json.
$json{key1}   = "value1";
$json{key2}   = "value2";
$hash               = {};
$hash->{'key1-1'}   = "value1-1";
$hash->{'key1-2'}   = "value1-2";
push(@{ $json{arrayOfHash} }, $hash);
$hash               = {};
$hash->{'key2-1'}   = "value2-1";
$hash->{'key2-2'}   = "value2-2";
push(@{ $json{arrayOfHash} }, $hash);
$json = encode_json(%json);
print $json;

其次,由于您似乎真的想尽可能避免引用,因此您可以使用块和my声明来使这两个%hash事物变得不同:

use JSON; # imports encode_json, decode_json, to_json and from_json.
$json{key1}   = "value1";
$json{key2}   = "value2";
{
    my %hash               = ();
    $hash{'key1-1'}   = "value1-1";
    $hash{'key1-2'}   = "value1-2";
    push(@{ $json{arrayOfHash} }, %hash);
}
{
    my %hash               = ();
    $hash{'key2-1'}   = "value2-1";
    $hash{'key2-2'}   = "value2-2";
    push(@{ $json{arrayOfHash} }, %hash);
}
$json = encode_json(%json);
print $json;

这两种方法中的任何一种都可以满足您的需求。

您正在引用哈希,然后更改哈希。引用不会创建哈希的副本,而是仍然指向相同的数据结构。(有关在 Perl 中创建和使用引用的更多信息,请参阅 perlref 和 perlreftut。

相反,您需要:

push(@{ $json{arrayOfHash} }, {%hash});

或:

push(@{ $json{arrayOfHash} }, {
    'key1-1' => 'value1-1', 
    'key1-2' => 'value1-2',
});

您还应该use strictuse warnings您编写的每个Perl文件的顶部。

最新更新