使用for / foreach访问数组引用数组的正确语法是什么

时间:2014-12-09 15:20:01

标签: perl for-loop reference

假设:

my @main_array = ();

my @sub_array1 = ( 1, 2, 3, 4, 5);
my @sub_array2 = ( "a", "b", "c", "d", "e" );

push @main_array, \@sub_array1;
push @main_array, \@sub_array2;
print "size of main_array is ",scalar(@main_array),"\n";

我想通过main_array和 然后通过它包含的两个数组 我不知道它的语法是什么。

不知道这是否正确,但Perl似乎想在前面拿一个$ foreach变量在这里。 (不喜欢@ $ sub_array) 我也想知道循环通过main和sub的语法。

foreach my $sub_array (@main_array)
{
   print $sub_array; # prints ARRAY(0x213232)
   # loop through each item in sub array
   #foreach ... 
}

编辑:总结下面给出的答案(感谢所有人):

use strict;
use warnings;

my @main_array = ();

my @sub_array1 = ( 1, 2, 3, 4, 5);
my @sub_array2 = ( "a", "b", "c", "d", "e" );

push @main_array, \@sub_array1;
push @main_array, \@sub_array2;
print "size of main_array is ",scalar(@main_array),"\n";

print "--------foreach ---------------------\n";

foreach my $sub_array (@main_array)
{
   print "Sub array has ", scalar(@{$sub_array})," elements\n";
   foreach my $value ( @{$sub_array})
   {
      print "value: ",$value,"\n";
   }
}

print "--------------- for ----------------------- \n";

for (my $i = 0; $i < scalar(@main_array); $i++)
{
    my $sub_array = $main_array[$i];
    print "Sub array has ", scalar( @{$sub_array}), " elements\n";
    for (my $j = 0; $j < scalar( @{$sub_array}); $j++)
    {
       print "value: ", $sub_array->[$j],"\n";
    }
}

2 个答案:

答案 0 :(得分:6)

my $sz = 0;
for my $outer (@main_array) {
  for my $inner( @{ $outer } ) {
     print $inner;
     $sz++;
    }
  }

print "total number of all values held in main_array is $sz \n";

perllol和perldsc是这些问题的良好信息来源

对于调试use Data::Dumper; print Dumper(\@main_array)很有用

希望这有帮助

答案 1 :(得分:3)

解决方案是传统的嵌套循环:

use warnings;
use strict;

my @sub_array1 =   ( 1, 2, 3, 4, 5  );
my @sub_array2 = qw/ a  b  c  d  e  /;
my @main_array = ( \@sub_array1, \@sub_array2 );

print "\@main_array has ", scalar @main_array, " elements.\n\n\n";

foreach my $outer ( @main_array ) {
    print "Sub array has ", scalar @{$outer}, " elements:\t";
    foreach my $inner ( @$outer ) {
        print "($inner) ";
    }
    print "\n";
}

这将产生以下输出:

@main_array has 2 elements.


Sub array has 5 elements:   (1) (2) (3) (4) (5) 
Sub array has 5 elements:   (a) (b) (c) (d) (e) 

要直接访问各个元素,您可以说:

print $main_array[1][3], "\n";

...会产生“d”。

或者在外部循环中你可以这样做:

for my $outer ( @main_array ) {
    print join( ' ', $outer->[0], $outer->[1], $outer->[2], $outer->[3], $outer->[4] ), "\n";
    # prints first five elements.
}

...但这有点愚蠢,因为它不像使用内循环那样灵活。