我有一个多维数组哈希,代表学生在前四个作业中每个科目的成绩。
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循环遍历数组的散列,因为它更容易处理。我该怎么做?
答案 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中,for
和foreach
的含义相同。
但这里的事情是 - 你没有数组的哈希 - 你有一个数组引用的哈希。
所以:
$students_grades{'Colton'}{'History'}
实际上是一个数组引用。
所以你可以取消引用它:
foreach my $grade ( @{ $students_grades{'Colton'}{'History'} } ) {
print "$grade\n";
}