2013-06-02 34 views
3

我有一个数组散列,我想按数组大小对它们进行排序。如何按数组大小对数组的散列进行排序

这是到目前为止我的代码:

use strict; 
use warnings; 

my %hash_array = (
    "array_1" => ["apple", "ball", "cat"], 
    "array_2" => ["def", "leppard", "rocks", "too"], 
    "array_3" => ["italian", "pastry", "missing", "cherry", "top"], 
); 

# Length of array_1 
my $array_1_size = @{$hash_array{"array_1"}}; 
print "Should print three: $array_1_size\n"; 

# Found this here: https://stackoverflow.com/questions/15722286 
# But my result remains unsorted 
foreach my $key (sort { $hash_array{$b} <=> $hash_array{$a}} keys %hash_array) { 
    print "key: $key\n"; 
} 

我知道如何获得一个独立的数组的大小,但我不知道如何,结合具有排序功能。

我从here复制了最后一个foreach块,但该解决方案对我无效,因为我的输出没有排序。我有一些关于最后一块代码的问题:

  1. 我没有看到前面引用的$ b和$ a。这是一个内置的参考,分类功能理解?
  2. 该解决方案似乎已经为原始海报工作,但它不适用于我的情况。然而我们最初的目标是相似的。我为了获得基于数组大小的有序输出而丢失了什么?
  3. 根据数组大小以升序和降序排列数组散列的最佳方法是什么?
+0

如果你看一下你提到的问题,海报上写着*“我不知道这是为什么不工作” *有关你复制的代码。他接受的答案是你应该复制的内容。 – Borodin

回答

5

你很近。正如所写的,您正在比较数组引用,它们是更多或更少的内存地址。我修改你的代码稍微给你,你找什么:

foreach my $key (sort { scalar(@{$hash_array{$b}}) <=> scalar(@{$hash_array{$a}}) } keys %hash_array) { 
    print "key: $key\n"; 
} 
+0

非常好!我知道这是一件小事。谢谢:) –

+2

当'<=>'运算符应用标量上下文时,不需要调用'scalar'。 '@ {$ hash_array {$ b}} <=> @ {$ hash_array {$ a}}'很好。 – Borodin

4

排序函数就是 - anonymous子类。你不限于一次比较,你只需要返回-1,0或1的结果。是的,$a$b是比较的两个值 - 它们可以是标量或引用。

您可能会解决你的问题是这样的:

foreach my $key (sort { 
         my $length_a = scalar @{$hash_array{$a}}; 
         my $length_b = scalar @{$hash_array{$b}}; 
         $length_b <=> $length_a 
         } keys %hash_array) { 
    ... 
} 

我知道,可以减少到一个班轮,但关键是要展示你怎么能有比sort子里面一个比较详细。

+0

无用的'scalar'。 – ikegami

+0

有意无用的用于教育目的。 :-)我看到接受的答案恰恰是我的答案,没有任何语境或解释。 – RET

1
for my $key (sort{ my ($x,$y)[email protected]_array{$a,$b}; @$y <=> @$x } keys %hash_array) { 

    print "key: $key\n"; 
}