如何正确地将引用的哈希值添加到数据结构而不覆盖之前的值?

时间:2016-01-20 19:05:39

标签: arrays perl hash

我使用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"
    }
  ]
} 

2 个答案:

答案 0 :(得分:5)

问题是%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;

这些方法中的任何一种都可以达到你想要的效果。

答案 1 :(得分:4)

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

相反,您需要:

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

或者:

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

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