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

Учитывая хеш в Perl (любой хеш), как я могу извлечь значения из этого хеша в порядке их добавления и поместить их в массив?

Пример:

my %given = ( foo => '10', bar => '20', baz => '15' );

Я хочу получить следующий результат:

my @givenValues = (10, 20, 15);

Ответы [ 4 ]

17 голосов
/ 03 августа 2010

С perldoc perlfaq4: Как сделать так, чтобы мой хэш запомнил порядок, в который я помещал элементы?


Используйте Tie::IxHash из CPAN.

use Tie::IxHash;
tie my %myhash, 'Tie::IxHash';

for (my $i=0; $i<20; $i++) {

    $myhash{$i} = 2*$i;
}

my @keys = keys %myhash;
# @keys = (0,1,2,3,...)
5 голосов
/ 03 августа 2010

Следующее будет делать то, что вы хотите:

my @orderedKeys = qw(foo bar baz);
my %records     = (foo => '10', bar => '20', baz => '15');

my @givenValues = map {$records{$_}} @orderedKeys;

Примечание: еще лучшим решением является использование Tie :: IxHash или Tie :: Hash :: Indexed для порядка вставки в сохранитель.

3 голосов
/ 03 августа 2010

Если у вас есть список ключей в правильном порядке, вы можете использовать срез хеша:

 my @keys   = qw(foo bar baz);
 my %given  = {foo => '10', bar => '20', baz => '15'}
 my @values = @given{@keys};

В противном случае используйте Tie::IxHash.

2 голосов
/ 03 августа 2010

Вы можете использовать values, но я думаю, что вы не можете получить их в правильном порядке, так как заказ уже был потерян, когда вы создали хэш

...