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循环遍历数组的散列,因为它更容易处理.我怎么做?
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)