Perl:通过这个时髦的阵列迭代?

Mag*_*ked 1 arrays perl multidimensional-array

我正在尝试迭代以这种特定方式构造的2D数组.这是否是构造数组的好方法是另一个问题 - 我仍然需要能够迭代它(如果可能的话).

@row1 = ( "Current Scan", "Last Month");
@row2 = ( "240", "0");
@row3 = ( "226", "209");
@row4 = ( "215", "207");

@array = (\@row1, \@row2, \@row3, \@row4);
print Dumper(@array);
printarray(@array);
Run Code Online (Sandbox Code Playgroud)

Dumper给我以下输出:

$VAR1 = [
          'Current Scan',
          'Last Month'
        ];
$VAR2 = [
          '240',
          '0'
        ];
$VAR3 = [
          '226',
          '209'
        ];
$VAR4 = [
          '215',
          '207'
        ];
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几个for循环但没有成功.每个只打印第一行($ VAR1)并退出.这是我最近的尝试:

sub printarray {
  @array = shift;
  $rowi = 0;
  foreach my $row (@array) {
    for (my $coli = 0; $coli <= @$row; $coli++) {
      print "$array[$rowi][$coli]\n";
    }
    $rowi++;
  }
}
Run Code Online (Sandbox Code Playgroud)

我显然忽略了一些简单的事情.我究竟做错了什么?提前致谢!

Iva*_*uev 10

如果您只想打印数组,请尝试以下代码:

foreach my $row (@array) {
   foreach my $elem (@$row) {
       print $elem; ## print elements without separator
   }
   print "\n"; ## new line after row
}
Run Code Online (Sandbox Code Playgroud)

如果你出于某种目的需要索引,我们在这里:

for(my $row_i = 0; $row_i < @array; $row_i++) {
    for(my $column_i = 0; $column_i < @{ $array[$row_i] }; $column_i++) {
        print $array[$row_i][$column_i];
    }
}
Run Code Online (Sandbox Code Playgroud)

这个想法是@array标量上下文中返回数组中元素的数量.而且@{ $array[$row_i] }有点棘手.它取消引用存储的数组$array[$row_i].

子程序更新:

在perl中,您可以通过引用传递数组:

 printarray(\@array); ## pass reference

 sub printarray {
     my $array_ref = shift; ## no copy created

     foreach my $row (@$array_ref) { ## now we need to dereference
         ...
     }
 }
Run Code Online (Sandbox Code Playgroud)

您还可以传递数组副本:

 printarray(@array);

 sub printarray {
     my @array_copy = @_; ## store local copy of array
     ...
 }
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅如何传递/返回{Function,FileHandle,Array,Hash,Method,Regex}?手册页.

use strict;在程序的开头添加.它会强制你声明所有变量,但是如果输入错误的话会节省大量时间.