如何从哈希表中映射(和排序)值?该哈希表包含多个哈希表。

6
我有一个哈希的哈希,如下所示:
%hash = ( 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
请原谅我如果我错了,我还在学习如何使用map。但我想知道如何映射哈希的哈希?这是否可能使用map?我还没有找到任何关于如何实现这一点的例子。
更好的做法是,在填充完数组后对其进行排序。我相信这是可能的,但我不够聪明去使用map自己找出答案。如何一次完成所有操作?
谢谢。 Seth
3个回答

11

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

my @array = sort { $a <=> $b } map $_->{b}, values %hash;

太好了,正是我想要的。我用这一行代码替换了26行代码,并将该函数的性能从O(n)提高到了O(1)。谢谢! - sgsax
1
好的,它仍然需要遍历哈希值并对其进行排序,因此它实际上不是O(1)。 - Corey

3

这将使用已排序的数组引用填充@array,每个引用都包含b的值和它来自的哈希引用。

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

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

1
$a->[0]жҜ”$$a[0]жӣҙжҳ“иҜ»пјӣеҗҢж ·пјҢ$_->{b}д№ҹжҜ”$$_{b}жӣҙжҳ“иҜ»гҖӮ - Philip Potter
在排序数字时,最好使用<=>运算符而不是cmp - Eugene Yarmash
@eugene => 很好的观点,正在修复。 @Philip => 我更喜欢双符号的原因有两个。首先,它与其他解引用形式(如@$a[1, 2])保持一致。其次,->运算符用于方法调用,因此我更喜欢仅在调用代码的情况下使用它。 - Eric Strom

1

采用您的第二个解决方案,并将 @hasharray 替换为 values %hash

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

(别忘了加上 ; 来结束语句。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接