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

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

更好的是,此代码中的下一步是在填充数组后对其进行排序。我很确定这是可能的,但我不够聪明地使用地图自己弄清楚。我将如何一口气完成这一切?

谢谢。赛斯

4

3 回答 3

11

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

my @array = sort { $a <=> $b } map $_->{b}, values %hash;
于 2010-08-27T15:03:11.617 回答
3

这填充@array了一个排序的数组引用列表,每个引用都包含它的值b和它来自的 hashref。

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

my @sorted_hashes = map {$$_[1]} @array;
于 2010-08-27T15:05:24.047 回答
1

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

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

(并且不要忘记;终止语句。)

于 2010-08-27T14:58:20.723 回答