Какой самый элегантный способ вывернуть хеш наизнанку? - PullRequest
7 голосов
/ 14 февраля 2012

Какой самый элегантный способ вывернуть хеш наизнанку?

Под этим я подразумеваю замену ключей значениями и наоборот (при условии, что все значения уникальны на 100%).

* 1005 Е.Г. *

Начните с

my %start = (1=>"a", 2=>"b", 3=>"c");

# ...

# PROFIT: 
my %finish = ("c" => 3, "b" => 2, "a" => 1);

Я знаю, что могу сделать это грубым путем:

foreach my $key (keys %start) {
    my $value = $start{$key};
    $finish{ $value } = $key;
}

Но это не самый элегантный способ Перли!

Ответы [ 2 ]

15 голосов
/ 14 февраля 2012

reverse, вероятно, является одним из самых идиоматических способов:

my %finish = reverse %start;

Это работает, потому что в обратном порядке хеш %start принимает в качестве списка формы (ключ1 значение1 ключ2 значение2 ... ключN значениеN);затем обратный процесс переворачивает список (значениеN ключN ... значение1 ключ1).Присвоение этого списка хеш-переменной превращает его в хеш, в котором нечетные элементы становятся ключами, а четные элементы становятся значениями

Или вы можете использовать map (менее элегантно, но все еще идиоматично):

my %finish = map { ( $start{$_} => $_ ) } keys %start;
10 голосов
/ 14 февраля 2012
my %start = (1=>"a", 2=>"b", 3=>"c");

my %finish;
@finish{values %start} = keys %start;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...