2013-03-22 73 views
0

我有一個Perl腳本,它執行遞歸函數。在它內部比較2維陣列的兩個元素:Perl嘗試修改非創建數組值,下標-1

我用2D數組「@data」和「0」作爲初始值調用該例程。首先我加載參數到一個單獨的2D陣列「@test」

然後我想看看,如果數組只包含一個元素 - >比較,如果最後一個元素==第一個。這是發生錯誤的地方:嘗試修改非可創建的數組值,下標-1。

您試圖使數組值彈簧變爲存在,並且下標可能爲負數,即使從數組末尾向後計數也是如此。

這並沒有幫助我太多...我很確定它與if子句「$ counter-1」有關。但我不知道是什麼,希望你們能幫助我!

routine(@data,0); 

sub routine { 
    my @test #(2d-Array) 

    my $counter = $_[-1] 

    for(my $c=0; $_[$c] ne $_[-1]; $c++){ 

     for (my $j=0; $j<13;$j++){ #Each element has 13 other elements 

      $test[$c][$j] = $_[$c][$j]; 

     } 
    } 
    if ($test[$counter-1][1] eq $test[-1][1]{ 

     $puffertime = $test[$counter][4]; 

    } 
    else{ 
     for (my $l=0; $l<=$counter;$l++){ 

      $puffertime+= $test[$l][4] 

     } 
    }  
} 
# 
# 
# 

if ($puffertime <90){ 

    if($test[$counter][8]==0){ 

     $counter++; 
     routine(@test,$counter); 
    } 


    else{ return (print"false");} 

} 
else{return (print "true");} 

奇怪的是,我今天早上試了一下,它的工作。經過一段時間的跑步後,他又想出了這個錯誤信息。可能是因爲我沒有趕上錯誤星座,這可能是由動態數據庫條目發生的。

+0

是否使用數組的最後一個元素來存儲元素的數量? 'my $ counter = $ _ [ - 1]'是什麼? – Arkadiy 2013-03-22 13:15:03

+0

@Arkadiy,他正在把計數器作爲常規的「第二」論點。 – 2013-03-22 13:19:35

+0

使用包含唯一ID的[-1] [1]測試的最後一個元素來檢查數組是否只有一個元素,然後將值傳遞給$ puffertime,這對於以下代碼很重要 – phips0r 2013-03-22 13:23:01

回答

0

routine()功能會更容易些,如果它開始了這樣的閱讀:

sub routine { 
    my @data = @_; 
    my $counter = pop(@data); 
    my @test; 

    for(my $c=0; $c <= $#data; $c++){ 
    for (my $j=0; $j<13;$j++){ #Each element has 13 other elements 
     $test[$c][$j] = $data[$c][$j]; 
    } 
    } 

您可以檢查,看看是否@data只有通過做scalar(@data) == 1$#data == 0一個元素。從你的代碼片段,我不明白你爲什麼需要複製數據傳遞到routine()@test。似乎多餘。如果不打算修改傳遞到例程的任何數據,則可以跳過所有這些複製。 你的下一個代碼可能是這樣的:

if ($#test == 0) { 
    $puffertime = $test[0][4]; 
} else { 
    for (my $l=0; $l <= $counter; $l++) { 
    $puffertime += $test[$l][4]; 
    } 
} 

但是如果你的全局變量$puffertime被初始化爲零,那麼你可以將這段代碼: