Perl排序多键哈希

时间:2015-05-26 17:19:05

标签: perl sorting hash key

我有一个哈希

%grades{$subject}{$student}=$score

我正在尝试从哈希中需要排序的学生中提取每个主题的前30个分数,但我不确定如何对多个密钥哈希进行排序。

到目前为止,我有这个,但这给了我每一个得分而不是每个科目所需的前30名。此外,有更快的方式来执行查询,因为我有近200K学生。

foreach my $subject(sort keys %grades) {
    foreach my $student(keys %{ $grades{$subject} }) {
        print "$subject, $student: $grades{$subject}{$student}\n";
    }
}

2 个答案:

答案 0 :(得分:5)

这为每个主题排序前2个分数(仅用于说明目的)。您应该将0 .. 1更改为0 .. 29作为前30名:

use warnings;
use strict;

my %grades = (
    math => {bill=>55, joe=>66, mike=>77},
    hist => {bill=>72, joe=>33, mike=>99},
    read => {bill=>95, joe=>24, mike=>22},
);

for my $subject (sort keys %grades) {
    my %gr = %{ $grades{$subject} };
    for my $student ((reverse sort { $gr{$a} <=> $gr{$b} } keys %gr)[0 .. 1]) {
        print "$subject $student $gr{$student}\n";
    }
}

__END__

hist mike 99
hist bill 72
math mike 77
math joe 66
read bill 95
read joe 24

请参阅perldoc perldscHow do I sort a hash (optionally by value instead of key)?

答案 1 :(得分:-3)

统计他们。

$count++;
last if $count > 30;