在哈希中插入哈希的循环?

时间:2014-08-01 11:59:51

标签: perl

如果我有以下

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)};
}

2 个答案:

答案 0 :(得分:2)

你不需要循环,

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

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

答案 1 :(得分:2)

如上所述,您的代码有几个问题。

  1. Curly括号引入哈希引用,而不是哈希。哈希是从列表创建的,因此请使用括号:

    my %a = (x => 1, y => 1);
    my %b = (z => 1);
    
  2. 如果您使用our %aour %b代替my并使用strict refs,则可能会有所需要。这是因为符号引用仅适用于全局变量:

    for my $hash_name (qw( a b )) {
        no strict 'refs';
        $big{$hash_name} = \%{$hash_name};
    }
    

    你可能不需要它,因为你已经知道有两个名为ab的哈希,所以为什么要根据它们的名字进行循环呢?如果您确实想要保存一些击键,可以使用字符串eval生成代码:

    for my $hash_name (qw( a b )) {
        eval "\$big{$hash_name} = \\%$hash_name";
    }
    

    我认为比

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

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