2012-08-07 132 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' => {} 
        } 
     };