2

我有以下哈希哈希:

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

);

如何迭代每个内部哈希(比如燧石)并为每次这样的迭代提取键名(丈夫、朋友)和相应的值?

4

3 回答 3

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} }) { ... }
于 2013-05-28T16:04:04.387 回答
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. 如果需要,它可以更容易地跟踪诸如哪个外部键导致这一点的事情(如我的输出所示)。

于 2013-05-28T16:33:05.373 回答
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}{$_};
  }
}
于 2013-05-28T16:42:20.903 回答