【问题标题】:Perl: Generating an Array of hashes from a filePerl:从文件生成哈希数组
【发布时间】:2019-04-28 10:45:17
【问题描述】:

我正在尝试创建一个哈希数组,其中包含学生姓名作为键,多个成绩作为每个学生的值,以便我可以计算每个学生的平均值,按降序对平均值进行排序,然后打印每个学生的“姓,名:平均成绩”按排序顺序排列。
我遇到的问题是哈希数组的生成,我 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= }

【问题讨论】:

    标签: perl hashtable


    【解决方案1】:
    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等级?

    【讨论】:

    • 我应该能够记录、忽略和报告任何带有不正确数据的条目,例如 5x9
    • 在填充哈希之前随意添加验证。
    • 我认为 5x9 是一个错字。它可能是 59
    • 它的存在是为了让您可以测试捕获错误的输入数据。我需要捕获任何无效的成绩数据并在计算并报告所有好的数据后报告它
    • 您可以使用核心Scalar::Util 模块中的looks_like_number 函数来捕获非数字字符串。
    猜你喜欢
    • 2012-11-19
    • 2016-07-23
    • 2016-10-07
    • 2023-03-17
    • 2011-04-20
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多