Как построить хеш из хэшей - PullRequest
3 голосов
/ 15 июля 2011

Мне нужно сравнить два хэша, но я не могу получить внутренний набор ключей ...

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 ]

4 голосов
/ 15 июля 2011

$options{$key} - скаляр (вы можете сказать, что ведущий - $ сигил).Вы хотите "разыменовать" его, чтобы использовать в качестве хэша:

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

Когда вы будете готовы действительно погрузиться в эти вещи, см. perllol, perldsc и perlref.

1 голос
/ 15 июля 2011

Я предполагаю, что вы говорите "опции" там, где вы имеете в виду "ХЭШ"?

Хэши хранят только скаляры, а не другие хэши;каждое значение% 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};
    }
}
...