在perl中将哈希推到数组上,结果难以理解
这是为什么在perl中将哈希推到数组上,结果难以理解,perl,Perl,这是为什么 my @menu; my %el1 = ("element1" => "hello"); push @menu, \%el1; my %el2 = ("element2" => "world"); push @menu, \%el2; print to_json({"menu", @menu}); 拿出这个 { "menu": {
my @menu;
my %el1 = ("element1" => "hello");
push @menu, \%el1;
my %el2 = ("element2" => "world");
push @menu, \%el2;
print to_json({"menu", @menu});
拿出这个
{
"menu": {
"element1": "hello"
},
"HASH(0x18e2280)": null
}
而不是这个
{
"menu": {
"element1": "hello",
"element2": "world"
}
}
如果将引用传递给数组,则结果更清晰:
print to_json({"menu", \@menu});
如果将引用传递给数组,则结果更清晰:
print to_json({"menu", \@menu});
您已将两个哈希引用推送到@menu上。因此,当您运行此代码时:
print to_json({"menu", @menu});
就好像你在跑:
print to_json({ "menu", \%el1, \%el2 });
{…}之间的位被解释为散列,因此第一项和第三项被视为散列键,第二项被视为值。所以你得到了你看到的输出。并且,正如在评论中指出的,您将在use warnings(使用警告)下得到警告,因为第二个键没有关联的值
我想你想写的是:
print to_json({ "menu", \@menu });
但即使这样也不对。您将获得以下信息:
{
"menu":[{
"element1":"hello"
},{
"element2":"world"
}]
}
添加到数组中的两个散列仍然非常独立
但你真正想要的是一个散列。因此,创建它
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
use Data::Dumper;
my @menu;
my %el1 = (
"element1" => "hello",
"element2" => "world",
);
print to_json({"menu", \%el1});
您已将两个哈希引用推送到@menu上。因此,当您运行此代码时:
print to_json({"menu", @menu});
就好像你在跑:
print to_json({ "menu", \%el1, \%el2 });
{…}之间的位被解释为散列,因此第一项和第三项被视为散列键,第二项被视为值。所以你得到了你看到的输出。并且,正如在评论中指出的,您将在use warnings(使用警告)下得到警告,因为第二个键没有关联的值
我想你想写的是:
print to_json({ "menu", \@menu });
但即使这样也不对。您将获得以下信息:
{
"menu":[{
"element1":"hello"
},{
"element2":"world"
}]
}
添加到数组中的两个散列仍然非常独立
但你真正想要的是一个散列。因此,创建它
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
use Data::Dumper;
my @menu;
my %el1 = (
"element1" => "hello",
"element2" => "world",
);
print to_json({"menu", \%el1});
此外,启用警告;{'menu',@menu}将在匿名哈希中给出奇数个元素,在这种情况下,还将启用警告;在这种情况下,{menu',@menu}将在匿名哈希中给出奇数个元素