Как извлечь ключи хеша в заданном порядке? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующий хеш:

%hash =  (
  name => {
     pos => 1
  },
  name_xxx => {
     pos => 2
  },
  name_yyy => {
     pos => 3
  },
)

И я хочу создать следующий массив (ключи должны быть упорядочены по pos):

qw/ name name_xxx name_yyy /

Полагаю, мне следует сделать Преобразование Шварца

Какой самый короткий и / или самый быстрый способ извлечь ключи хеша в указанном порядке?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Просто используйте keys и sort

#!/usr/bin/env perl

use warnings;
use strict;

my %hash =  (
  name => {
     pos => 1
  },
  name_xxx => {
     pos => 2
  },
  name_yyy => {
     pos => 3
  },
);

my @sorted_array = sort { $hash{$a}{pos} <=> $hash{$b}{pos} } (keys %hash);

print "@sorted_array", "\n";

Он будет численно отсортирован по положению.

0 голосов
/ 28 сентября 2018

Самый короткий способ - использовать List :: UtilsBy , который внутренне выполняет преобразование Шварца для большинства своих функций.Однако в этом случае он, вероятно, будет медленнее, потому что доступ к хешу быстрый, и он добавляет дополнительные издержки по сравнению со стандартным sort ().Случай, когда это может быть быстрее, если вы сортируете, например, по результату медленного вызова подпрограммы.

use strict;
use warnings;
use List::UtilsBy 'nsort_by';
my %hash = (
  name => {
     pos => 1
  },
  name_xxx => {
     pos => 2
  },
  name_yyy => {
     pos => 3
  },
);
my @sorted_keys = nsort_by { $hash{$_}{pos} } keys %hash;
0 голосов
/ 27 сентября 2018

То, что у вас есть, это не хеш, это ссылка на хеш (с пропущенными запятыми).Чтобы получить ключи, используйте keys и разыменование:

#!/usr/bin/perl
use warnings;
use strict;

my $hash_ref = {
    name     => {pos => 1},
    name_xxx => {pos => 2},
    name_yyy => {pos => 3},
};

my @keys = sort { $hash_ref->{$a}{pos} <=> $hash_ref->{$b}{pos} }
           keys %$hash_ref;
print "@keys\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...