Как построить хеш из хэшей

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

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 ответа

Решение

$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,

Я предполагаю, что вы говорите "варианты" там, где вы имеете в виду "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};
    }
}
Другие вопросы по тегам