2013-05-28 303 views
2

我具有以下散列的散列:如何從散列哈希中提取密鑰名稱?

%HoH = (
flintstones => { 
    husband => "fred", 
    pal  => "barney", 
}, 
jetsons => { 
    husband => "george", 
    wife  => "jane", 
    his boy => "elroy", 
}, 
simpsons => { 
    husband => "homer", 
    wife  => "marge", 
    kid  => "bart", 
}, 

);

如何迭代每個內部散列(比如說flintstones)並且還爲每個這樣的迭代提取鍵名(丈夫,朋友)和相應的值?

回答

2
for my $k (keys %{ $HoH{flintstones} }) { 

    my $v = $HoH{flintstones}{$k}; 
    print "key is $k; value is $v\n"; 
} 

另一種方法是使用each

while(my($k, $v) = each %{ $HoH{flintstones} }) { ... } 
0
for my $outer_key (keys %HoH) 
    { 
    print "Values for inner_hash $outer_key:\n"; 
    for my $inner_key (keys %{$HoH{$outer_key}}) 
     { 
     print "\t'$inner_key' points to " . $HoH{$outer_key}{$inner_key} . "\n"; 
     } 
    } 

因爲在外部級點每個鍵的散列在內水平,我們可以使用所有在該條​​目中的正常散列函數。

儘管可以在沒有雙循環的情況下以更簡潔的方式編寫此代碼,但我更喜歡嵌套循環,原因有二。

  1. 當別人必須在代碼上工作(包括六個月內的其他人)時,這一點更爲明顯。

  2. 如果需要(如我的輸出中所示),它可以更輕鬆地跟蹤哪些外鍵導致此問題。

0

就遍歷所有的哈希值(由keysvalueseach,這取決於你是否需要鑰匙和口味),然後在內部散列(同樣)循環。

因此,要獲得全部由該散列描述的人:

for (values %HoH) { 
    for (values $_) { 
    push @people, $_ 
    } 
} 

,或建立所有丈夫的表,所有的妻子,等:

for my $fam (values %HoH) { 
    push @{$relations{$_}}, $fam->{$_} for keys $fam 
} 

還是要重新把丈夫關在桌子上:

for my $fam (keys %HoH) { 
    $patriarchs{$HoH{$fam}{husband}}{family} = $fam; 
    for (keys $HoH{$fam}) { 
    next if $_ eq 'husband'; 
    $patriarchs{$HoH{$fam}{husband}}{$_} = $HoH{$fam}{$_}; 
    } 
}