Perl 在散列中插入散列的循环?

Perl 在散列中插入散列的循环?,perl,Perl,如果我有以下几点 my %big = (); my %a = {x => 1, y => 1}; my %b = {z => 1}; 我想以%a和%b作为结尾,在%big中这样做 $VAR1 = { 'b' => { 'x' => 1 }, 'a' => { 'y' => 1,

如果我有以下几点

my %big = ();
my %a = {x => 1, y => 1};
my %b = {z => 1};
我想以
%a
%b
作为结尾,在
%big
中这样做

$VAR1 = {
          'b' => {
                   'x' => 1
                 },
          'a' => {
                   'y' => 1,
                   'x' => 1
                 }
        };
问题

如何编写循环将插入许多散列,如
%a
%b
%big

更新

根据我的答案,我解决了这个问题

for my $x (@{$c->{slaves}}) {
    $big{$x} = {xx::getFsList($x)};
}
你不需要循环

my %a = (x => 1, y => 1);
my %b = (z => 1);

my %big = (a => \%a, b => \%b);
你不需要循环

my %a = (x => 1, y => 1);
my %b = (z => 1);

my %big = (a => \%a, b => \%b);

正如所写的,您的代码有几个问题

  • 花括号引入散列引用,而不是散列。哈希是从列表中创建的,因此请使用括号:

    my %a = (x => 1, y => 1);
    my %b = (z => 1);
    
  • 如果您使用
    我们的%a
    我们的%b
    而不是
    我的
    ,并启用
    严格参考
    ,您可能会想要什么。这是因为符号引用仅适用于全局变量:

    for my $hash_name (qw( a b )) {
        no strict 'refs';
        $big{$hash_name} = \%{$hash_name};
    }
    
    不过,您可能不需要它,因为您已经知道有两个名为
    a
    b
    的散列,所以为什么要循环它们的名称呢?如果确实想保存一些击键,可以使用字符串
    eval
    生成代码:

    for my $hash_name (qw( a b )) {
        eval "\$big{$hash_name} = \\%$hash_name";
    }
    
    我不认为它比

    my %big = ( a => \%a,
                b => \%b,
              );
    
  • 要创建来自函数的列表哈希,可以使用

    my $char = 'a';
    while (my @list = func()) {
        $big{ $char++ } = { @list };
    }
    

    正如所写的,您的代码有几个问题

  • 花括号引入散列引用,而不是散列。哈希是从列表中创建的,因此请使用括号:

    my %a = (x => 1, y => 1);
    my %b = (z => 1);
    
  • 如果您使用
    我们的%a
    我们的%b
    而不是
    我的
    ,并启用
    严格参考
    ,您可能会想要什么。这是因为符号引用仅适用于全局变量:

    for my $hash_name (qw( a b )) {
        no strict 'refs';
        $big{$hash_name} = \%{$hash_name};
    }
    
    不过,您可能不需要它,因为您已经知道有两个名为
    a
    b
    的散列,所以为什么要循环它们的名称呢?如果确实想保存一些击键,可以使用字符串
    eval
    生成代码:

    for my $hash_name (qw( a b )) {
        eval "\$big{$hash_name} = \\%$hash_name";
    }
    
    我不认为它比

    my %big = ( a => \%a,
                b => \%b,
              );
    
  • 要创建来自函数的列表哈希,可以使用

    my $char = 'a';
    while (my @list = func()) {
        $big{ $char++ } = { @list };
    }
    

    如果要为哈希动态创建名称
    a
    b
    等,请务必小心。如果要动态地为散列创建名称
    a
    b
    等,请参阅并非常小心。请参阅,它实际上是一个函数
    getList()
    ,返回类型为
    %a
    %b
    的散列,所以我想这就是为什么我需要一个循环。我不知道会调用多少次
    getList()
    ,从而输出一个散列,该散列应该进入
    %big
    @JasmineLognnes:函数究竟返回什么?仅仅是一个列表?@JasmineLognnes所以键应该是
    a
    b
    c
    等等?我对问题做了一个糟糕的简化,并且还把哈希的
    ()
    {}
    搞混了。请参阅更新后的OP,在那里我发布了解决我问题的方法。它实际上是一个函数
    getList()
    ,返回类型为
    %a
    %b
    的散列,所以我想这就是为什么我需要一个循环的原因。我不知道会调用多少次
    getList()
    ,从而输出一个散列,该散列应该进入
    %big
    @JasmineLognnes:函数究竟返回什么?仅仅是一个列表?@JasmineLognnes所以键应该是
    a
    b
    c
    等等?我对问题做了一个糟糕的简化,并且还把哈希的
    ()
    {}
    搞混了。请参阅更新的OP,我在那里发布了解决我问题的方法。