如何构造哈希哈希

时间:2011-07-15 16:49:32

标签: perl foreach hash hash-of-hashes

我需要比较两个哈希值,但我无法获得内部键集......

my %HASH = ('first'=>{'A'=>50, 'B'=>40, 'C'=>30},
            'second'=>{'A'=>-30, 'B'=>-15, 'C'=>9});
foreach my $key (keys(%HASH))
{
   my %innerhash = $options{$key};
   foreach my $inner (keys(%innerhash))
   {
      print "Match: ".$otherhash{$key}->{$inner}." ".$HASH{$key}->{$inner};
   }
}

2 个答案:

答案 0 :(得分:4)

$options{$key}是一个标量(你可以说是领先的$ sigil)。您想要“取消引用”它以将其用作哈希:

my %HASH = ('first'=>{'A'=>50, 'B'=>40, 'C'=>30},
            'second'=>{'A'=>-30, 'B'=>-15, 'C'=>9});
foreach my $key (keys(%HASH))
{
   my %innerhash = %{ $options{$key} };  # <---- note %{} cast
   foreach my $inner (keys(%innerhash))
   {
      print "Match: ".$otherhash{$key}->{$inner}." ".$HASH{$key}->{$inner};
   }
}

当您准备好深入了解这些内容时,请参阅perllolperldscperlref

答案 1 :(得分:1)

我猜你在那里说“选项”,你的意思是“HASH”?

哈希只存储标量,而不存储其他哈希值; %HASH的每个值都是需要解除引用的哈希引用,因此你的内部循环应该是:

foreach my $inner (keys(%{ $HASH{$key} })

或者:

my %HASH = ('first'=>{'A'=>50, 'B'=>40, 'C'=>30},
            'second'=>{'A'=>-30, 'B'=>-15, 'C'=>9});
foreach my $key (keys(%HASH))
{
    my $innerhash = $HASH{$key};
    foreach my $inner (keys(%$innerhash))
    {
        print "Match: ".$otherhash{$key}->{$inner}." ".$innerhash->{$inner};
    }
}
相关问题