如何按给定顺序提取哈希键?

时间:2018-09-27 08:26:07

标签: perl data-structures

我有下一个哈希:

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

并要构造下一个数组(键必须由pos排序):

qw/ name name_xxx name_yyy /

我想我应该Schwartzian Transform

按给定顺序提取哈希键的最短和/或最快方法是什么?

3 个答案:

答案 0 :(得分:5)

您拥有的不是散列,而是散列引用(缺少逗号)。要获取密钥,请使用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";

答案 1 :(得分:3)

只需使用keyssort

#!/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";

它将按pos值进行数字排序。

答案 2 :(得分:1)

最短的方法是使用List::UtilsBy,它内部对其大部分功能进行Schwartzian变换。但是,在这种情况下,它可能会变慢,因为散列访问速度很快,并且比标准sort()会增加额外的开销。可能更快的情况是,例如,您根据慢子程序调用的结果进行排序。

asp-items