Как мне сопоставить (и отсортировать) значения из хэша? - PullRequest
6 голосов
/ 27 августа 2010

У меня есть хэш хэшей, вот так:

%hash = ( a  => { b => 1, c =>2, d => 3},
          a1 => { b => 11, c =>12, d => 13},
          a2 => { b => 21, c =>22, d => 23} )

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

@hasharray = ( { b => 1, c =>2, d => 3},
               { b => 11, c =>12, d => 13},
               { b => 21, c =>22, d => 23} )
@array = map { ($_->{b} => $_) } @hasharray

Простите, если я ошибаюсь, я все еще изучаю, как работает карта. Но то, что я хотел бы знать, - как бы я занялся отображением хэша хэшей? Возможно ли это с помощью карты? Мне еще не удалось найти каких-либо примеров этого.

Еще лучше, следующим шагом в этом коде будет сортировка массива после его заполнения. Я почти уверен, что это возможно, но я не достаточно умен, чтобы использовать карту, чтобы понять это сам. Как мне сделать все это за один раз?

Спасибо. Сет

Ответы [ 3 ]

11 голосов
/ 27 августа 2010

Это извлекает и сортирует все "b" s:

my @array = sort { $a <=> $b } map $_->{b}, values %hash;
3 голосов
/ 27 августа 2010

Заполняет @array отсортированным списком ссылок на массивы, каждая из которых содержит значение b и хэш-значение, из которого оно получено.

my @array = sort {$$a[0] <=> $$b[0]}
            map  { [$$_{b} => $_] } 
            values %hash;

my @sorted_hashes = map {$$_[1]} @array;
1 голос
/ 27 августа 2010

Возьмите ваше второе решение и замените values %hash на @hasharray:

@array = map { ($_->{b} => $_) } values %hash;

(И не забудьте ;, чтобы прекратить утверждение.)

...