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;在程序的开头添加.它会强制你声明所有变量,但是如果输入错误的话会节省大量时间.