2014-02-10 120 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,這將消除任何錯誤的可能性。特別是判斷退出循環的適當條件。