Perl 如何从散列映射(和排序)值?

Perl 如何从散列映射(和排序)值?,perl,sorting,map,hash-of-hashes,Perl,Sorting,Map,Hash Of Hashes,我有一个散列,如下所示: %hash = ( a => { b => 1, c =>2, d => 3}, a1 => { b => 11, c =>12, d => 13}, a2 => { b => 21, c =>22, d => 23} ) %散列=(a=>{b=>1,c=>2,d=>3}, a1=>{b=>11,c=>12,d=>13}, a2=>{b=>21,c=>22,d=>23}) 我想提取“b”元素并将其放入数组中。现在,我正在通过哈希

我有一个散列,如下所示:

%hash = ( a => { b => 1, c =>2, d => 3}, a1 => { b => 11, c =>12, d => 13}, a2 => { b => 21, c =>22, d => 23} ) %散列=(a=>{b=>1,c=>2,d=>3}, a1=>{b=>11,c=>12,d=>13}, a2=>{b=>21,c=>22,d=>23}) 我想提取“b”元素并将其放入数组中。现在,我正在通过哈希循环来实现这一点,但我认为使用map可以稍微提高效率。我很确定,如果这是一个散列数组,我会使用如下内容:

@hasharray = ( { b => 1, c =>2, d => 3}, { b => 11, c =>12, d => 13}, { b => 21, c =>22, d => 23} ) @array = map { ($_->{b} => $_) } @hasharray @hasharray=({b=>1,c=>2,d=>3}, {b=>11,c=>12,d=>13}, {b=>21,c=>22,d=>23}) @array=map{($\->{b}=>$\}@hasharray 如果我错了,请原谅,我仍在学习map的工作原理。但我想知道的是,如何映射散列的散列?这甚至可以使用地图吗?我还没有找到任何这样做的例子

更好的是,这段代码的下一步是在填充数组后对其进行排序。我很确定这是可能的,但我还没有足够的智慧使用地图来解决这个问题。我该如何一次完成这一切

谢谢。
Seth

采用第二种解决方案,用
@hasharray
替换
值%hash

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

(不要忘记使用
终止语句。)

这将提取并排序所有的“b”:

my@array=sort{$a$b}map$\->{b},值%hash;

这将用数组引用的排序列表填充
@array
,每个数组引用都包含
b
的值及其来源的hashref

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

my @sorted_hashes = map {$$_[1]} @array;
my@array=sort{$$a[0]$$b[0]}
映射{[$${b}=>$\]}
值%hash;
my@sorted_hashes=map{$$\[1]}@array;

$a->[0]
$$a[0]
更容易阅读;类似地,
$${b}
而不是
$${b}
。排序数字时最好使用
运算符,而不是
cmp
。@eugene=>很好,正在修复@Philip=>我更喜欢双重符号有两个原因。首先,它适用于其他形式的去引用,如
@$a[1,2]
。其次,
->
操作符用于方法调用,所以我更喜欢只在调用代码的情况下使用它。这非常有效,正是我想要的。我用这一行代码替换了26行代码,并将该函数的性能从大约O(n)提高到了O(1)。谢谢它仍然需要遍历散列的值并对它们进行排序,所以它实际上不是O(1)。
my @array = sort {$$a[0] <=> $$b[0]}
            map  { [$$_{b} => $_] } 
            values %hash;

my @sorted_hashes = map {$$_[1]} @array;