如何从哈希散列中映射(和排序)值?

时间:2010-08-27 14:55:23

标签: 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} )

我想提取“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

请原谅我,如果我错了,我还在学习地图是如何运作的。但我想知道的是如何绘制哈希哈希的映射?这甚至可以使用地图吗?我还没有找到任何这样做的例子。

更好的是,此代码的下一步是在数组填充后对其进行排序。我很确定这是可能的,但是我在使用地图自己弄清楚时并不够聪明。我怎样才能一次性完成这一切?

感谢。 塞特

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

这会使@array填充一个排序的数组引用列表,每个引用都包含b的值及其来自的hashref。

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

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

答案 2 :(得分:1)

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

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

(并且不要忘记;来终止声明。)