在Perl中循环遍历多维数组哈希

coo*_*490 2 arrays perl hash foreach multidimensional-array

我有一个多维数组哈希值,表示学生在前四个作业中每个科目的成绩.

my %students_grades = (
    Colton => {
        English     => [ 90, 95, 80, 75 ],
        Mathematics => [ 77, 89,94, 100 ],
    },
);
Run Code Online (Sandbox Code Playgroud)

语法有点偏,但这里是创建上面数组哈希的代码.

#!/usr/bin/perl
my %students_grades;
$students_grades{'Colton'}{'English'}[0] = 90;
$students_grades{'Colton'}{'English'}[1] = 95;
$students_grades{'Colton'}{'English'}[2] = 80;
$students_grades{'Colton'}{'English'}[3] = 75;

$students_grades{'Colton'}{'History'}[0] = 77;
$students_grades{'Colton'}{'History'}[1] = 89;
$students_grades{'Colton'}{'History'}[2] = 94;
$students_grades{'Colton'}{'History'}[3] = 100;
Run Code Online (Sandbox Code Playgroud)

如何使用foreach循环遍历他在历史记录中收到的学生成绩?现在我正在使用for循环遍历它.

my $num_of_grades = scalar @{$students_grades{'Colton'}{'History'}};
for (my $i=0; $i <= $num_of_grades; $i++) {
    print $students_grades{'Colton'}{'History'}[$i] . "\n";
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码的表示,但在我的实际程序中,我的数组散列更复杂,所以我想使用foreach循环遍历数组的散列,因为它更容易处理.我怎么做?

ike*_*ami 6

for (my $i=0; $i<@array; ++$i) {
   my $ele = $array[$i];
   ...
}
Run Code Online (Sandbox Code Playgroud)

可写得更简单

for my $ele (@array) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用以下内容:

for my $grade (@{ $students_grades{'Colton'}{'English'} }) {
   print("$grade\n");
}
Run Code Online (Sandbox Code Playgroud)
my $grade = $students_grades{'Colton'}{'English'}[0];
Run Code Online (Sandbox Code Playgroud)

是的缩写

my $grade = $students_grades{'Colton'}->{'English'}->[0];
Run Code Online (Sandbox Code Playgroud)

这意味着你可以做到

my $grades = $students_grades{'Colton'}{'English'};
my $grade = $grades->[0];
Run Code Online (Sandbox Code Playgroud)

这意味着你也可以使用以下内容:

my $grades = $students_grades{'Colton'}{'English'};
for my $grade (@$grades) {
   print("$grade\n");
}
Run Code Online (Sandbox Code Playgroud)

知道这一点可以轻松升级到以下内容:

for my $student_name (keys(%students_grades)) {
   my $student_grades_by_class = $students_grades{$student_name};
   for my $class_name (keys(%$student_grades_by_class)) {
      my $grades = $student_grades_by_class->{$class_name};
      for my $grade (@$grades) {
         print("$student_name: $class_name: $grade\n");
      }
   }
}
Run Code Online (Sandbox Code Playgroud)