Perl对非可创建数组值的修改,下标-1

时间:2013-03-22 13:09:13

标签: arrays perl compare

我有一个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");}

奇怪的是,我今天早上尝试了它,它起作用了。经过短暂的运行后,他再次提出了这条错误消息。可能是因为我没有赶上错误星座,这可能是由动态数据库条目引起的。

1 个答案:

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