我有以下散列哈希:
%HoH = (
flintstones => {
husband => "fred",
pal => "barney",
},
jetsons => {
husband => "george",
wife => "jane",
his boy => "elroy",
},
simpsons => {
husband => "homer",
wife => "marge",
kid => "bart",
},
);
如何遍历每个内部哈希(比如flintstones)并且还为每个这样的迭代提取键名(丈夫,朋友)和相应的值?
答案 0 :(得分: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} }) { ... }
答案 1 :(得分: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";
}
}
因为外层中的每个键都指向内层的哈希,我们可以使用该条目上的所有常规哈希函数。
虽然可以在没有双循环的情况下以更简洁的方式编写它,但我更喜欢嵌套循环有两个原因。
当其他人必须处理代码时(包括您在六个月内与其他人一起工作),这一点更为明显。
如果需要,可以更容易地跟踪诸如哪个外键导致这一点(如我的输出中所示)。
答案 2 :(得分:0)
只需循环遍历哈希(keys
或values
或each
,具体取决于您是否需要密钥和品味)然后循环遍历内部哈希(同样)。
所以,要得到这个哈希所描述的所有人:
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}{$_};
}
}