perl以递归方式填充哈希哈希值

时间:2012-08-07 18:40:42

标签: perl recursion hash-of-hashes

我有这样的哈希:

{ ABC => [1, 2],
     1 => [11, 12,13,14],
     13 => [17,20] }

我想生成像这样的散列哈希:

(ABC => { 1 => {11 => {},
                12 => {},
                13 => { 17 => {}
                        20 = {} },
                14 => {}
               },
          2 => {}
        }

)

上面的哈希只不过是一个带有根节点和更多子节点的树。

我知道我们必须使用递归来检查每个父节点的子节点。我看过先前问过的问题here。我无法理解在递归过程中特定节点的数据是如何存储在其特定的父键下的。换句话说,如何以递归方式填充散列哈希?

感谢任何指示或解释。

感谢您的时间

3 个答案:

答案 0 :(得分:3)

真正的问题是你真的不知道自己想要什么。

 {ABC => 1 => 11 => {}
     => 1 => 12 => {}
     => 1 => 13 => 17 => {}
                => 20 = {}
     => 1 => 14 => {}
} 

只是一种非常奇怪的写作方式

{
   ABC => "1",
   11  => {},
   1   => "12",
   {}  => "1",
   13  => "17",
   {}  => "20",
   {}  => "1",
   14  => {},
}

这没有任何意义。我想你真的想要

{
   ABC => {
      1 => {
         11 => {},
         12 => {},
         13 => {
            17 => {},
            20 => {},
         },
         14 => {},
      },
   },
}

既然你知道自己想要什么,那就应该实施它。

答案 1 :(得分:1)

您可以使用我在此处定义的代码:How can I merge several hashes into one hash in Perl?

定义了@hash_list所以:

my @hash_list 
    = { map { ref() eq 'ARRAY' ? { map {; $_ => {} } @$_ } : $_ } 
        %{{ ABC => [1, 2]
          ,  1  => [11, 12,13,14]
          , 13  => [17,20] 
          }}
      };

答案 2 :(得分:1)

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my %data = (
    ABC => [1, 2],
     1  => [11, 12, 13, 14],
     13 => [17, 20] 
);
my %hash;

sub modify_hash {
    my ($base, $ref) = @_;
    for my $k (keys %$ref) {
        if (exists $base->{$k}) {
            $ref->{$k} = $base->{$k};
            delete $base->{$k};
        }
        modify_hash($base, $ref->{$k});
    }
}

map { %{$hash{$_}} = map { $_ => {}; } @{$data{$_}}; } keys %data;
map { modify_hash(\%hash, $hash{$_}); } keys %hash;
print Dumper(\%hash);

输出:

$VAR1 = {
          'ABC' => {
                     '1' => {
                              '11' => {},
                              '13' => {
                                        '17' => {},
                                        '20' => {}
                                      },
                              '12' => {},
                              '14' => {}
                            },
                     '2' => {}
                   }
        };