Perl:从文件生成哈希数组

标签 perl hashtable

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

学生.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= }

最佳答案

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";
}

请注意,我收到了警告:

Argument "5x9" isn't numeric in subroutine entry at ./1.pl line 11, <> line 3.

应该如何对待5x9等级?

关于Perl:从文件生成哈希数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487041/

相关文章:

Perl 优化 : inlining a function changed the results

java - 为什么在尝试增加值并将其放回 HashMap 时会引发编译错误?

algorithm - 为所有字谜生成相同的唯一哈希码

hash - 多值哈希 Common Lisp

xml - 如何使用 XPath 和 Perl 检索属性

perl - 如何让 Getopt::Long + pod2usage 工作?

javascript - 使用 jQuery/Perl/Mechanize 处理不同单引号 (') 和 (') 的最佳方法是什么?

perl - 在 Perl 中自动处理 Excel 文件并避免对话框/UI 交互

c - 哈希表内存泄漏

C 哈希表库 native 支持每个键的多个值