我对Perl完全不熟悉,我需要编写一个程序,如果它们彼此相距一定距离,则会找到匹配的程序。所以我得到了一个哈希数组,其中包含每个级别的开始位置,结束位置和群集中存在的匹配数(开头为1)。
如果我想知道两场比赛之间的距离是否合适,我会做Begin2-End1
my $DEBUG = 1;
my @hitsarray =();
my ($beginarray,$endarray,$aantalarray);
my $hit = { BEGIN => $beginarray, EIND => $endarray, MATCHES => $aantalarray, };
for (my $k = 0;$k <= $#beginarray;$k++)
{
print $beginarray[$k],"\t",$endarray[$k],"\t",$aantalarray[$k],"\n" if ($DEBUG);
$hit = ();
$hit->{BEGIN} = $beginarray[$k];
$hit->{END} = $endarray[$k];
$hit->{MATCHES} = $aantalarray[$k];
push (@hitsarray,$hit);
}
for ( my $m = 0; $m <= $#hitsarray; $m++)
{
while($hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} < 5 && $hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} > 3)
{
$hitsarray[$m]{END} = $hitsarray[$m+1]{EIND};
$hitsarray[$m]{MATCHES} +=1;
delete $hitsarray[$m+1];
print $beginarray[$m],"\t",$endarray[$m],"\t",$aantalarray[$m],"\n" if ($DEBUG);
}
}
但它不起作用!我的电脑进入一个循环,并在脚本第55行说明“在减法( - )中使用未初始化的值。”
它可能必须使用引用做一些事情,但我真的不明白那些.. 我还尝试了一个带有两个非连接数组的简单结构,但我遇到了同样的问题;
如何使用来自不同行(以及来自不同数组)的元素进行减法?
任何帮助都非常受欢迎!!
答案 0 :(得分:6)
我知道这似乎不是最有帮助的,但是你的代码是错误的,没有一个问题或一个修正。以下是一些问题。
use warnings; use strict;
放在脚本的顶部。$beginarray[$m]
时,该变量名称相同,但实际上是与$ beginarray不同的变量,这是一个标量。$hit = ();
实际上只是将 SCALAR 变量$ hit设置为0,因为这是数组()
的长度。delete $hitsarray[$m+1]
将从数组中删除该值,但该索引将为空,其上方的项目不会在数组中移动。要从阵列中删除项目,您需要grep到新阵列或拼接现有阵列。您需要制作一个更小的示例或使用数组来弄清楚您做错了什么。
答案 1 :(得分:0)
for ( my $m = 0; $m <= $#hitsarray; $m++)
{
while($hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} < 5 && $hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} > 3)
这里使用元素$ m + 1,它超出了迭代最终数组的末尾。也许你的for循环应该说$m < $#hitsarray
。