在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}将在匿名哈希中给出奇数个元素