2014-06-30 78 views
-1

*更新*錯字遍歷一個使用每個

另一個PERL問題在Perl的多維陣列的尺寸....我通過2D陣列試圖循環。我對一個方面的積極性表示肯定,但對第二方面不確定。代碼片段:

foreach my $value (@surfaces[1]) 
       { 
        my $sum = 0; 
        my $smallest = 9999; 
        my $limit_surface = 0; 
        for (my $i = 0; $i < 3; $i++) 
        { 
         $sum += $surfaces[$i][$counter]; 
         if ($surfaces[$i][$counter] <= $smallest) 
         { 
          $smallest = $surfaces[$i][$counter]; 
          $limit_surface = $subchannel_number[$i]; 
         } 
        } 
        $counter++; 
        push(@avg_value,$sum/@rodsurface_number); 
        push(@limiting_schan,$limit_surface); 
        push(@limiting_value,$smallest); 
       } 

我已編譯但$ value變量未能初始化。

+3

'foreach'是一個單詞。 – toolic

+0

@toolic更新的線程錯字不會影響錯誤。 – TheCodeNovice

+1

你應該更新錯誤信息''各個' – toolic

回答

4

重複:

Perl不具有多維數組
Perl不具有多維數組
Perl不具有多維數組

什麼的Perl確實有被有有陣列包含引用指向其他數組。你可以用在Perl中模擬多維數組,但它們不是真正的多維數組。例如:

my @array; 
$array[0] = [ 1, 2, 3, 4, 5 ]; 
$array[1] = [ 1, 2, 3 ]; 
$array[2] = [ 1, 2 ]; 

我可以談論$array[0][1]$array[2][1],但同時存在$array[0][3]$array[2][3]不存在。

如果你不明白的引用,請閱讀tutorial on references

你需要做的是通過你的數組,然後找出每個子陣列的尺寸,並通過每這些的。有沒有保證

  1. 所包含的主數組中引用實際上指向另一個數組:
  2. 那你的子陣列只包含標量數據。

您可以使用$#運算符來查找數組的大小。例如$#array是數組中的項目數。你使用(0..$#array)去遍歷你的數組中的每一項,這樣,你就有索引來玩弄。

use strict; 
use warnings; 

my @array; 
$array[0] = [ 1, 2, 3, 4, 5 ]; 
$array[1] = [ 1, 2, 3 ]; 
$array[2] = [ 1, 2, ]; 

# 
# Here's my loop for the primary array. 
# 
for my $row (0..$#array) { 
    printf "Row %3d: ", $row ; 
    # 
    # My assumption is that this is another array that contains nothing 
    # but scalar data... 
    # 
    my @columns = @{ $array[$row] }; # Dereferencing my array reference 
    for my $column (@columns) { 
     printf "%3d ", $column; 
    } 
    print "\n"; 
} 

注意我做my @columns = @{ $array[$row] };參考轉換回一個數組。這是一個額外的步驟。我可以簡單地在我的for循環中完成取消引用並保存了一個步驟。

此打印出:

Row 0: 1 2 3 4 5 
Row 1: 1 2 3 
Row 2: 1 2 

我可以把一些安全檢查在這裏。例如,我可能想要驗證每一行的大小,如果一行不匹配另一個,抱怨:

my $row_size = $array[0]; 
for my $row (1..$#array) { 
    my @columns = @{ $array[$row] }; 
    if ($#columns ne $array_size) { 
     die qq(This is not a 2D array. Not all rows are equal); 
    } 
} 
+0

'$#array'返回數組的最後一個索引,它比數組的大小小1。 http://stackoverflow.com/questions/7406807/find-size-of-an-array-in-perl – stenlytw

1

我設置了一些虛擬變量並改變了一些東西。這編譯併產生了我在下面顯示的結果。

這可能不會回答你的問題,但應該允許你複製和粘貼代碼,自己運行它,編輯輸入並查看輸出與你想要的比較。

use warnings; 
use strict; 
use Data::Dumper; 
$Data::Dumper::Sortkeys = 1; 

my @surfaces = (['1','2','3'], 
      ['10','20','30'], 
      ['100','200','400'], 
      ); 

my @subchannel_number = (['1','2','3'], 
      ['10','20','30'], 
      ['100','200','400'], 
      ); 

my @rodsurface_number = (1 .. 10); 
my $counter = 0; 

my (@avg_value, @limiting_schan, @limiting_value); 

foreach my $value ($surfaces[1]){ 
    my $sum = 0; 
    my $smallest = 9999; 
    my $limit_surface = 0; 
     for (my $i = 0; $i < 3; $i++) { 
      $sum += $surfaces[$i][$counter]; 
       if ($surfaces[$i][$counter] <= $smallest){ 
        $smallest = $surfaces[$i][$counter]; 
        $limit_surface = $subchannel_number[$i]; 
       } 
     } 
     $counter++; 
     push(@avg_value,$sum/@rodsurface_number); 
     push(@limiting_schan,$limit_surface); 
     push(@limiting_value,$smallest); 
} 

print Dumper (\@avg_value, \@limiting_schan, \@limiting_value); 

$VAR1 = [ 
      '11.1' 
     ]; 
$VAR2 = [ 
      [ 
      '1', 
      '2', 
      '3' 
      ] 
     ]; 
$VAR3 = [ 
      1 
     ]; 
2

你沒有描述你的數據結構,也不說明你想用它做什麼。這限制了我們可以給一般品種的建議。

如果你想迭代一個數組數組,我建議你根據元素而不是索引來做。

例如,下面我有一個4乘5的整數矩陣。我想找到這些值的平均值。這樣做的一個方法是簡單地遍歷每個行,然後列,並添加了值:

use strict; 
use warnings; 

my @AoA = (
    [11, 12, 13, 14, 15], 
    [21, 22, 23, 24, 25], 
    [31, 32, 33, 34, 35], 
    [41, 42, 43, 44, 45], 
); 

my $sum = 0; 
my $count = 0; 

for my $row (@AoA) { 
    for my $element (@$row) { # <-- dereference the array ref 
     $sum += $element; 
     $count++; 
    } 
} 

print "Average of Matrix is " . ($sum/$count) . "\n"; 

輸出:

Average of Matrix is 28 

有關複雜的數據結構的更多信息,請訪問:Perl Data Structures Cookbook之後我