Сторнирование многозначного хэша в perl - PullRequest
5 голосов
/ 20 июля 2010

У меня есть хеш, который выглядит следующим образом:

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

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

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

Ответы [ 2 ]

6 голосов
/ 20 июля 2010

Не нужно скользкого пути:

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
2 голосов
/ 20 июля 2010

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

my %hash = (
    bmw      => { id => 1, color => 'brown' },
    mercedes => { id => 2, color => 'black' },
);
my %new_hash;
@new_hash{ map { $_->{id} } values %hash } = keys %hash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...