【问题标题】:How to construct a hash of hashes如何构造散列的散列
【发布时间】:2011-10-06 07:56:35
【问题描述】:

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

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};
   }
}

【问题讨论】:

    标签: perl foreach hash hash-of-hashes


    【解决方案1】:

    $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

    【讨论】:

    • 我不知道你可以在 PERL 中转换一个变量,非常感谢!
    • @mob 的答案是“perldoc perlreftut”中“使用规则 1”的应用,因此您应该从该文档开始。
    【解决方案2】:

    我猜你说的是“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};
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2013-07-19
      • 2010-09-26
      • 2016-07-18
      • 2013-03-15
      • 2016-09-04
      • 2016-05-02
      • 2016-08-03
      • 2013-07-08
      相关资源
      最近更新 更多