Arrays Perl:迭代这个时髦的数组?
我试图迭代一个以这种特定方式构造的2D数组。这是否是构造数组的好方法是另一个问题——我仍然需要能够迭代它(如果可能的话) Dumper为我提供以下输出:Arrays Perl:迭代这个时髦的数组?,arrays,perl,multidimensional-array,Arrays,Perl,Multidimensional Array,我试图迭代一个以这种特定方式构造的2D数组。这是否是构造数组的好方法是另一个问题——我仍然需要能够迭代它(如果可能的话) Dumper为我提供以下输出: $VAR1 = [ 'Current Scan', 'Last Month' ]; $VAR2 = [ '240', '0' ]; $VAR3 = [ '226', '209'
$VAR1 = [
'Current Scan',
'Last Month'
];
$VAR2 = [
'240',
'0'
];
$VAR3 = [
'226',
'209'
];
$VAR4 = [
'215',
'207'
];
我尝试了几个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++;
}
}
子打印数组{
@数组=移位;
$rowi=0;
foreach my$行(@array){
对于(my$coli=0;$coli),如果只想打印数组,请尝试以下代码:
foreach my $row (@array) {
foreach my $elem (@$row) {
print $elem; ## print elements without separator
}
print "\n"; ## new line after row
}
如果出于某种目的需要索引,我们将:
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];
}
}
您还可以传递数组的副本:
printarray(@array);
sub printarray {
my @array_copy = @_; ## store local copy of array
...
}
有关更多详细信息,请参阅手册页
请在程序开始时添加使用strict;
。这将强制您声明所有变量,但如果您键入错误,将节省大量时间。如果您只想打印数组,请尝试以下代码:
foreach my $row (@array) {
foreach my $elem (@$row) {
print $elem; ## print elements without separator
}
print "\n"; ## new line after row
}
#!/usr/bin/perl
use warnings;
use strict;
my @row1 = ( "Current Scan", "Last Month");
my @row2 = ( "240", "0");
my @row3 = ( "226", "209");
my @row4 = ( "215", "207");
my @array = (\@row1, \@row2, \@row3, \@row4);
foreach my $row (@array) {
foreach my $value (@$row) {
print "$value\n";
}
}
如果出于某种目的需要索引,我们将:
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];
}
}
您还可以传递数组的副本:
printarray(@array);
sub printarray {
my @array_copy = @_; ## store local copy of array
...
}
有关更多详细信息,请参阅手册页
请在程序开始时添加使用strict;
。这将强制您声明所有变量,但如果您键入错误,将节省大量时间
#!/usr/bin/perl
use warnings;
use strict;
my @row1 = ( "Current Scan", "Last Month");
my @row2 = ( "240", "0");
my @row3 = ( "226", "209");
my @row4 = ( "215", "207");
my @array = (\@row1, \@row2, \@row3, \@row4);
foreach my $row (@array) {
foreach my $value (@$row) {
print "$value\n";
}
}
#!/usr/bin/perl
使用警告;
严格使用;
my@row1=(“当前扫描”、“上个月”);
my@row2=(“240”,“0”);
my@row3=(“226”,“209”);
my@row4=(“215”、“207”);
我的@array=(\@row1、\@row2、\@row3、\@row4);
foreach my$行(@array){
foreach my$value(@$行){
打印“$value\n”;
}
}
这会打印出来
Current Scan
Last Month
240
0
226
209
215
207
当前扫描
上个月
240
0
226
209
215
207
不确定这是否是你想要的
#!/usr/bin/perl
使用警告;
严格使用;
my@row1=(“当前扫描”、“上个月”);
my@row2=(“240”,“0”);
my@row3=(“226”,“209”);
my@row4=(“215”、“207”);
我的@array=(\@row1、\@row2、\@row3、\@row4);
foreach my$行(@array){
foreach my$value(@$行){
打印“$value\n”;
}
}
这会打印出来
Current Scan
Last Month
240
0
226
209
215
207
当前扫描
上个月
240
0
226
209
215
207
不确定这是否是您想要的。是的,问题在于您将数组传递给子例程的方式。Perl将参数列表中的数组展平。基本上,printary(@array)
与printary($array[0],$array[1],$array[2],$array[3])等效
。printary
开头的shift
获取第一个参数并将其分配给@array
。因此,无论数组有多大,printary
只看到第一个元素。是的,问题在于将数组传递给子例程的方式。Perl会在参数li中展平数组基本上,printary(@array)
相当于printary($array[0],$array[1],$array[2],$array[3])
。printary
开头的shift
接受第一个参数并将其分配给@array
。因此,无论数组有多大,printary
只看到第一个元素。将数组传递到子例程中时,实际上传递了八个标量。然后,当你这样做时
sub printarray {
@array = shift;
…您只弹出列表中的第一个元素。请尝试:
sub printarray {
@array = @_;
当你将数组传递到子程序中时,你实际上是在传递八个标量
sub printarray {
@array = shift;
…您只弹出列表中的第一个元素。请尝试:
sub printarray {
@array = @_;
你在找这样的东西吗:
#!/usr/bin/perl
use warnings;
use strict;
use Algorithm::Loops 'MapCar';
my @row1 = ( "Current Scan", "Last Month");
my @row2 = ( "240", "0");
my @row3 = ( "226", "209");
my @row4 = ( "215", "207");
my @array = (\@row1, \@row2, \@row3, \@row4);
MapCar { print "Scan: $_[0]: $_[1], $_[2], $_[3]\n" } @array;
你在找这样的东西吗:
#!/usr/bin/perl
use warnings;
use strict;
use Algorithm::Loops 'MapCar';
my @row1 = ( "Current Scan", "Last Month");
my @row2 = ( "240", "0");
my @row3 = ( "226", "209");
my @row4 = ( "215", "207");
my @array = (\@row1, \@row2, \@row3, \@row4);
MapCar { print "Scan: $_[0]: $_[1], $_[2], $_[3]\n" } @array;
不确定您希望得到什么结果,但使用length
函数时出现错误。您不需要它,因为它返回字符串的长度。使用$coli<@$row
作为循环条件。谢谢,我对其进行了编辑,希望能让它更清晰一些。我基本上只是尝试遍历整个数组,出于某种原因儿子,这只是第一行。我想我遗漏了一个非常重要的部分。起初我以为只是我把迭代搞砸了,但我忘了我正在通过一个子程序传递它……我猜这就是问题所在……你使用的数据转储程序是错的。记住Perl将函数参数中的数组扩展为列表,所以如果y如果要转储顶级数组,则需要使用print Dumper\@array;
而不是现有的。Perl的列表扩展使普通函数调用类似于使用APPLY函数调用的Lisp函数。有关更多信息,请参阅。另外,有关使用常用数据结构的示例,请参阅perldoc中的perllol和perldsc。请参阅否我不确定您希望得到什么结果,但在使用length
函数时出现错误。您不需要它,因为它返回字符串的长度。使用$coli<@$row
作为循环条件。谢谢,我对它进行了编辑,希望能让它更清楚一点。我基本上只是尝试遍历整个数组,出于某种原因n它只经过第一行。我想我遗漏了一个非常重要的部分。起初我以为只是我把迭代搞砸了,但我忘了我正在通过一个子程序传递它…我猜这就是问题所在…你使用的数据转储程序是错误的。记住Perl将函数参数中的数组扩展为列表,所以如果你要转储顶级数组,您需要使用print Dumper\@array;
,而不是现有的。Perl的列表扩展使普通函数调用类似于使用APPLY函数调用的Lisp函数。有关更多信息,请参阅。另外,有关使用常用数据结构的示例,请参阅perldoc中的perllol和perldsc。请参阅我遗漏了上面一个更重要的部分。我太专注于迭代部分了,以至于忘了我已经通过了它