2013-02-18 199 views
1

比方说,我有构造散列数据结构的哈希值如下:排序的哈希值的Perl值哈希

%HoH => (
    flintstones => { 
       family_members => "fred;wilma;pebbles;dino", 
       number_of_members => 4, 
    }, 
    jetsons => { 
       family_members => "george;jane;elroy", 
       number_of_members => 3, 
    }, 
    simpsons => { 
       family_members => "homer;marge;bart;lisa;maggie", 
       number_of_members => 5, 
    }, 

) 

如何通过价值number_of_members从最大的关键,在这种情况下,家庭进行排序,至少?然后我想打印出最高的两个。这里有一个大致的了解,但我知道这是错的:

foreach $value (
    sort { 
    $HoH{$a}{$number_of_members} cmp $HoH{$b}{$number_of_members} 
    } keys %HoH) 
my $count = 0; 
while ($key, $value) = each %HoH) { 
    if (count <= 2){ 
     print "${HoH}{$key}\t$key{$value}"; 
    } 
} 
continue { 
    $count++; 
}; 

我想要的代码打印(空格是制表符分隔):

simpsons homer;marge;bart;lisa;maggie 
flintstones fred;wilma;pebbles;dino 
+0

'的perldoc -q sort' – toolic 2013-02-18 19:07:36

+0

与<=>替换CMP。你做一个数字比较 – user1937198 2013-02-18 19:18:45

回答

6

你在正确的轨道上。您可以在散列中使用$a$b内部变量,并以数值比较这些值(<=>而不是cmp)。

打印时,我发现最简单的方法是将密钥存储在数组中并使用数组切片来访问它们。

use strict; 
use warnings; 

my %HoH = (
    flintstones => { 
       family_members => "fred;wilma;pebbles;dino", 
       number_of_members => 4, 
    }, 
    jetsons => { 
       family_members => "george;jane;elroy", 
       number_of_members => 3, 
    }, 
    simpsons => { 
       family_members => "homer;marge;bart;lisa;maggie", 
       number_of_members => 5, 
    },  
); 
my @sorted = sort { $HoH{$b}{'number_of_members'} <=> 
        $HoH{$a}{'number_of_members'} } keys %HoH; 

for (@sorted[0,1]) { # print only first two 
    print join("\t", $_, $HoH{$_}{'family_members'}), "\n"; 
} 

输出:

simpsons  homer;marge;bart;lisa;maggie 
flintstones  fred;wilma;pebbles;dino 
+0

谢谢。为了理解所有内容,我必须仔细考虑一下,但我理解它的要点。 – cooldood3490 2013-02-18 19:26:11

+0

@ cooldood3490不客气。随意问清楚是否有什么不明确的地方。 – TLP 2013-02-18 21:39:47