我有一个Perl-Script,它执行一个递归函数。在其中比较了二维数组的两个元素:
我用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 :(得分: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 == 0
来查看@data是否只有一个元素。在您的代码段中,我不明白为什么您需要将数据复制到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];
}