0

我有一个执行递归函数的 Perl 脚本。在其中比较二维数组的两个元素:

我用二维数组“@data”和“0”作为起始值调用例程。首先,我将参数加载到单独的二维数组“@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");}

奇怪的是我今天早上试了一下,它奏效了。在运行了一小段时间后,他再次提出了此错误消息。可能是我没有赶上动态数据库条目可能发生的错误星座。

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 是否只有一个元素$#data == 0。从您的代码片段中,我看不出您为什么需要将数据复制到传递routine()@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 回答