Perl:我可以使用索引同时访问两个不同级别的哈希数组吗?

时间:2010-12-27 19:59:23

标签: perl

我对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行说明“在减法( - )中使用未初始化的值。”

它可能必须使用引用做一些事情,但我真的不明白那些.. 我还尝试了一个带有两个非连接数组的简单结构,但我遇到了同样的问题;

如何使用来自不同行(以及来自不同数组)的元素进行减法?

任何帮助都非常受欢迎!!

2 个答案:

答案 0 :(得分:6)

我知道这似乎不是最有帮助的,但是你的代码是错误的,没有一个问题或一个修正。以下是一些问题。

  1. use warnings; use strict;放在脚本的顶部。
  2. $ beginarray,$ endarray和$ aantalarray都是标量,而不是数组。您可能希望它们是对数组的引用,但它们不是因为您从未分配它们。注意:执行引用名为@beginarray的数组变量的$beginarray[$m]时,该变量名称相同,但实际上是与$ beginarray不同的变量,这是一个标量。
  3. 如果您在第55行遇到问题,则不会向我们展示所有内容
  4. 这个,$hit = ();实际上只是将 SCALAR 变量$ hit设置为0,因为这是数组()的长度。
  5. $#beginarray将为-1,因为未声明@beginarray。即使您更改了代码以声明它,它仍然没有数据,因此第一次看起来不会运行。
  6. delete $hitsarray[$m+1]将从数组中删除该值,但该索引将为空,其上方的项目不会在数组中移动。要从阵列中删除项目,您需要grep到新阵列或拼接现有阵列。
  7. 您需要制作一个更小的示例或使用数组来弄清楚您做错了什么。

答案 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