Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl:迭代这个时髦的数组?_Arrays_Perl_Multidimensional Array - Fatal编程技术网

Arrays Perl:迭代这个时髦的数组?

Arrays Perl:迭代这个时髦的数组?,arrays,perl,multidimensional-array,Arrays,Perl,Multidimensional Array,我试图迭代一个以这种特定方式构造的2D数组。这是否是构造数组的好方法是另一个问题——我仍然需要能够迭代它(如果可能的话) Dumper为我提供以下输出: $VAR1 = [ 'Current Scan', 'Last Month' ]; $VAR2 = [ '240', '0' ]; $VAR3 = [ '226', '209'

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

Dumper为我提供以下输出:

$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。请参阅我遗漏了上面一个更重要的部分。我太专注于迭代部分了,以至于忘了我已经通过了它