Инвертирование мультизначения хеширует в жемчуге

У меня есть хеш, который похож на это:

{ bmw      => { id => 1, color => brown } }
{ mercedes => { id => 2, color => black } }

Я хочу инвертировать этот хеш в жемчуге так, чтобы я просто получил отображение идентификатора => name_of_car. Я должен использовать обратную функцию так или иначе?

Примечание: Я могу всегда выполнять итерации через исходный хеш и присваивать ключи и значения соответственно в новом хеше, гайка, которую я хотел знать, был ли дождевик путь.

5
задан syker 20 July 2010 в 00:58
поделиться

2 ответа

Не нужен простой способ:

my %h = (
    bmw      => { id => 1, color => "brown" } ,
    mercedes => { id => 2, color => "black" } 
);
my %j = map { ($h{$_}{id} => $_) } keys %h;

for (keys %j) {
    print "$_ $j{$_}\n";
}

Вывод:

$ ./silly.pl 
1 bmw
2 mercedes
6
ответ дан 14 December 2019 в 04:29
поделиться

То, что вы опубликовали, недействительно на Perl, но я думаю, что понимаю ваше значение. Один из простых способов сделать это - использовать хэш-фрагмент и карту.

my %hash = (
    bmw      => { id => 1, color => 'brown' },
    mercedes => { id => 2, color => 'black' },
);
my %new_hash;
@new_hash{ map { $_->{id} } values %hash } = keys %hash;
2
ответ дан 14 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: