Perl: создание массива хэшей из файла - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать массив хешей, который содержит имена учеников в качестве ключей и несколько оценок в качестве значений для каждого ученика, чтобы я мог вычислить среднее для каждого ученика, отсортировать средние значения в порядке убывания и распечатать«фамилия, имя: средняя оценка» каждого учащегося в отсортированном порядке.
Проблема, с которой я столкнулся, связана с генерацией массива хэшей, и я на 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 голосов
/ 26 ноября 2018
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";
}

Обратите внимание, что я получаю предупреждение:

Аргумент "5x9" не является числовым в подпрограмме в строке ./1.pl строка 11, <> строка 3.

Как следует относиться к оценке 5x9?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...