Как построить хеш из хэшей
Мне нужно сравнить два хэша, но я не могу получить внутренний набор ключей...
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};
}
}