【问题标题】:Loop through multidimensional Hash of Arrays in Perl在 Perl 中循环遍历数组的多维哈希
【发布时间】:2016-01-27 01:32:49
【问题描述】:

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

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 循环遍历数组的哈希,因为它更容易处理。我该怎么做?

【问题讨论】:

  • 你的散列并不是你想的那样多维的。 =&gt; 在 Perl 中是一个逗号。你所拥有的是:( 'key: Colton' =&gt; 'value: English', 'key: Array(0x123456)' =&gt; 'value: Colton', 'key: Mathematics' =&gt; [ ... ] ),整体结构是一个哈希(不是一个 hashref)。

标签: arrays perl multidimensional-array hash foreach


【解决方案1】:
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");
      }
   }
}

【讨论】:

    【解决方案2】:

    在 perl 中,forforeach 的含义相同。

    但这里的问题是 - 你没有数组的散列 - 你有一个数组的散列 references

    所以:

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

    实际上是一个数组引用。

    所以你可以取消引用它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2012-07-27
      • 2019-01-13
      相关资源
      最近更新 更多