2012-08-07 130 views
-1

我有这样一个哈希:perl的填充哈希散列递归

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

我要生成散列这样的哈希:

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

) 

以上哈希只不过是一棵树一个根节点和更多的子节点。

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

欣赏任何指针或解释。

感谢您的时间

+1

你的需求得以确认。 '2'发生了什么事?一个人怎么能告诉'ABC'是根(因为哈希不是有序的)? – ikegami 2012-08-07 19:09:25

+1

@ikegami:“ABC”必须是根的原因之一是因为顶级密钥中只有它自己在任何地方都不会显示为子(值)。看起来像缺少的'2'是一个现在已经修复的错误。 – 2012-08-09 12:21:27

回答

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 => {}, 
     }, 
    }, 
} 

现在,你知道你想要什么,你应该实现它采取刺伤。

+0

@Axeman,'{}'不返回一个常量字符串。它甚至不返回一个字符串。 – ikegami 2012-08-07 21:15:59

+0

我认为,如果你遵循他的链接,大多数人都清楚OP的要求。 – mob 2012-08-07 22:06:20

+0

@Axeman,不,不。当用作键时,结果会被串化,但与这里讨论的任何内容无关。所有这些帖子都是不重要的,应该删除。 – ikegami 2012-08-08 04:29:33

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] 
      }} 
     }; 
+0

它不,如果你“使用我定义的代码[在链接]”,插入上面定义的@ hash_list。'{ ABC => { '1'=> { '11'=> {}, '12'=> {}, '13'=> { '17'=> {}, ' 20' => {}} , '14'=> {}} , '2'=> {}} } ' 哦 – Axeman 2012-08-08 12:23:43

+0

,我明白你的意思。 – ikegami 2012-08-09 14:58:28

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' => {} 
        } 
     };