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

时间:2015-10-27 14:59:26

标签: arrays perl multidimensional-array hash foreach

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

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

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

#!/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;

如何使用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";
}

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

2 个答案:

答案 0 :(得分:6)

for (my $i=0; $i<@array; ++$i) {
   my $ele = $array[$i];
   ...
}

可以写成更简单的

for my $ele (@array) {
   ...
}

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

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

的缩写
my $grade = $students_grades{'Colton'}->{'English'}->[0];

这意味着你可以做到

my $grades = $students_grades{'Colton'}{'English'};
my $grade = $grades->[0];

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

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

了解这一点可以轻松升级到以下内容:

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

答案 1 :(得分:3)

在perl中,forforeach的含义相同。

但这里的事情是 - 你没有数组的哈希 - 你有一个数组引用的哈希

所以:

 $students_grades{'Colton'}{'History'} 

实际上是一个数组引用。

所以你可以取消引用它:

foreach my $grade ( @{ $students_grades{'Colton'}{'History'}  } ) {
    print "$grade\n";
}