0

再帰関数を実行する Perl スクリプトがあります。その中で、2 次元配列の 2 つの要素を比較します。

2D 配列 "@data" と "0" を開始値としてルーチンを呼び出します。最初に、パラメーターを別の 2D 配列 "@test" に読み込みます。

次に、配列に要素が1つしか含まれていないかどうかを確認したい->最後の要素==最初の要素であるかどうかを比較します。そして、これがエラーが発生する場所です:作成できない配列値の変更が試行されました、添え字-1。

配列値を作成しようとしましたが、配列の末尾から逆方向に数えても、添え字がおそらく負でした。

これはあまり役に立ちませんでした... if-clause "$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");}

奇妙なことに、今朝試してみたらうまくいきました。しばらく実行した後、彼は再びこのエラーメッセージを思いつきました. 動的なデータベース エントリによって発生する可能性のあるエラー コンスタレーションに追いつかなかった可能性があります。

4

1 に答える 1

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];
    }
  }

scalar(@data) == 1またはを実行して、@data に要素が 1 つしかないかどうかを確認できます$#data == 0routine()コード スニペットから、渡されたデータを にコピーする必要がある理由がわかりません@test。余分なようです。ルーチンに渡されたデータを変更しない場合は、このコピーをすべてスキップすることもできます。次のコードは次のようになります。

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

ただし、グローバル変数$puffertimeがゼロに初期化されている場合は、このコードを次のように置き換えることができます。

for (my $l=0; $l <= $counter; $l++) {
  $puffertime += $test[$l][4];
}
于 2013-03-22T14:09:15.377 に答える