如何从哈希哈希中提取密钥名称?

时间:2013-05-28 15:59:15

标签: perl hash hash-of-hashes

我有以下散列哈希:

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

);

如何遍历每个内部哈希(比如flintstones)并且还为每个这样的迭代提取键名(丈夫,朋友)和相应的值?

3 个答案:

答案 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";
      }
   }

因为外层中的每个键都指向内层的哈希,我们可以使用该条目上的所有常规哈希函数。

虽然可以在没有双循环的情况下以更简洁的方式编写它,但我更喜欢嵌套循环有两个原因。

  1. 当其他人必须处理代码时(包括您在六个月内与其他人一起工作),这一点更为明显。

  2. 如果需要,可以更容易地跟踪诸如哪个外键导致这一点(如我的输出中所示)。

答案 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}{$_};
  }
}