2013-05-28 95 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}{$_}; 
    } 
}