2014-02-10 81 views
0

我正在写perl脚本,对于循环限制我没有什么问题。perl中的循环帮助

假设我有两个数组,arr1有序列号,arr2是二维数组,第一个维度是序列号[与arr1相同],第二个维度是该序列号的内容,现在我想为这个二维数组应用for循环,但我很困惑的极限。到现在我有这样的代码

Example : I have Three serial numbers , 1 ,2 ,3 . Serial 1 has 2 contents 1,5 . Serial 2 has 1 content i.e 1. Serial 3 has two contents 1,1. 
@arr1 = (1,2,3) 
$arr2[0][0] = 1 
$arr2[0][1] = 5 
$arr2[1][0] = 1 
$arr2[2][1] = 1 
$arr2[2][2] = 1 
Note: As you can see the contents of arr2 has arr1 elements in 1st columns and the contents in the second columns. 

for (my $i = 0; $i <= $#arr1; $i++) { 
    print("The First Serial number has:"); 
    for (my $j = 0; $j <= $#arr2; $j++) { 

     print("$arr2[$i][$j]\n"); 
    } 
} 

谢谢,对不起,我不好交代

回答

0

这是一个没有第一个数组的版本。

for (my $i = 0; $i<= $#arr; $i++) 
{ 
    print "INDEX $i\n"; 
    for (my $j = 0; $j <= $#{$arr[$i]}; $j++) 
    { 
     print "${arr[$i][$j]}\n"; 
    } 
} 

的此点是一个二维数组实际上是数组的数组(以及实际上数组引用,但这并不改变任何东西)。因此在内部循环中,您应该检查存储在$arr[$i]中的数组的大小。

+0

谢谢你们所有人 – user2828488

1

为什么不这样做那样:

#!/usr/bin/perl 
use strict; 

my @arr; 
$arr[0][0] = 1; 
$arr[0][1] = 5; 
$arr[1][0] = 1; 
$arr[2][1] = 1; 
$arr[2][2] = 1; 

my ($i, $j); 
foreach $i (@arr) { 
     foreach $j (@{$i}) { 
       print $j."\n" if($j); 
     } 
} 

1; 
__END__ 
+0

感谢您的评论,其实我必须从文件中扫描序列号和内容,这些数字和内容并不固定,这些都是可变的,所以这就是为什么第二个循环的限制会根据串行内容号码。 (ser1,ser2,ser3,ser4)@ arr2 =([ser1] [n1] [ser1] [n2],[ser2] [n1],[ser3] [n1] [ser3] [n2]等等 我在做什么我第一次扫描文件和存储序列在arr1然后我再次扫描和存储序列和内容在二维数组,arr2' – user2828488

1

固定码:

use strict; 
use warnings; 
my @arr1 = (1,2,3); 
my @arr2; 
$arr2[0][0] = 1; 
$arr2[0][1] = 5; 
$arr2[1][0] = 1; 
$arr2[2][0] = 1; # original code had 
$arr2[2][1] = 1; # these indexes wrong 

for (my $i = 0; $i <= $#arr1; $i++) { 
    print("Serial number $arr1[$i] has:"); 
    for (my $j = 0; $j <= $#{ $arr2[$i] }; $j++) { 
     print("$arr2[$i][$j]\n"); 
    } 
} 

请注意使用$#{ arrayref };见http://perlmonks.org/?node=References+quick+reference

1

你可以把@arr2这样,这将是您更容易理解@arr2

use strict; 
use warnings; 

my @arr1 = (1, 2, 3); 
my @arr2 = ([1, 5], [1], [1, 1]); 
for my $first(@arr1) { 
    for my $second (@{$arr2[$first-1]}) { 
     print $second."\n"; 
    } 
} 
0

试试这个。

my @arr2; 
    $arr2[0][0] = 1; 
    $arr2[0][1] = 5; 
    $arr2[1][0] = 1; 
    $arr2[2][0] = 1; 
    $arr2[2][1] = 1; 


    foreach $inside_array (@arr2){ 
      foreach $ele (@$inside_array){ 
        print $ele,"\n"; 
      } 
    } 

它总是更好地使用foreach而不是for/while,这将消除任何错误的可能性。特别是判断退出循环的适当条件。