Perl:从文件生成哈希数组

时间:2018-11-26 18:31:20

标签: perl hashtable

我正在尝试创建一个散列数组,其中包含学生姓名作为键,并为每个学生的值包含多个年级,以便我可以计算每个学生的平均值,按降序对平均值进行排序,然后打印每个学生的“姓,名:平均成绩”。
我遇到的问题是散列数组的生成,我很确定90%的问题出在第10行的拆分上,但我自己似乎找不到解决方法。

students.txt:

chipper jones 29 80 70
hank aaron 99 85 81 75
beth allen 64 84 71 5x9 38 68 53
andruw jones 100 100 100 100 100
ty cobb 75 75 100

代码:

#!/usr/bin/perl
#Program 5

my @Aoh;

open (FILEIN, "$ARGV[0]");

while(<FILEIN>) {
    chomp;
    push @Aoh, { split / / };

    for $i (0 .. $#Aoh) {
        print "{ ";
        for $role (keys %{ $Aoh[$i] }) {
            print " $role $Aoh[$i]{$role} ";
        }
    print "}\n";
    }
}

我得到的输出:

0 is { chipper=jones 70= 29=80 }
1 is { 81=75 hank=aaron 99=85 }
2 is { 38=68 53= beth=allen 64=84 71=5x9 }
3 is { 100= andruw=jones }
4 is { ty=cobb 75=75 100= }

1 个答案:

答案 0 :(得分:2)

push @Aoh, { split / / };

从第一行创建以下哈希:

{ chipper => 'jones',
  29      => 80,
  70      => undef,
}

那不是你想要的,对吧?

我将使用数字哈希而不是哈希数组。您可以直接使用“姓氏,名字”作为哈希键,也可以将平均值直接存储为值:

#!/usr/bin/perl
use warnings;
use strict;

use List::Util qw{ sum };

my %average;

while (<>) {
    my ($name, $surname, @grades) = split;
    $average{"$surname, $name"} = sum(@grades) / @grades;
}

for my $student (sort { $average{$a} <=> $average{$b} } keys %average) {
    print $student, ' ', $average{$student}, "\n";
}

请注意,我收到警告:

  

在./1.pl第11行,<>第3行的子例程条目中,参数“ 5x9”不是数字。

应该如何对待5x9等级?