警告:在Perl中使用数字eq中的未初始化值

时间:2015-03-03 05:46:36

标签: perl

我收到警告:

  

在script.pl第53行使用未初始化的值(==)if ; line 53 is if statement`

我的代码段:

foreach(@array)
{
    push @gene2refseq, $_;
}

foreach(@::ids)
{
    if($_ == $gene2refseq[1])
    {
        push @::prot_gi, $gene2refseq[6];
    }
}

现在,如果我在$gene2refseq[1]之前声明foreach(@::ids),则同样的错误仍然存​​在;但如果我在foreach(@::ids)之前初始化它。 $gene2refseq[1] = 0它没有给出错误但也没有结果;因为该值已初始化为0

我想我在错误的地方初始化它,但是我在哪里初始化它?因为我无法在foreach(@array)

之前或之内对其进行初始化

免责声明:我对use warningsuse strict

不太满意

编辑:已解决

感谢您的帮助;我刚刚宣布了@gene2refseq并在$gene2refseq[1] = 0之前初始化了foreach(@array),而且效果很好。

也感谢您在foreach使用情况下纠正我。

一个问题:

如果我必须访问数组的多个索引怎么办?我是否必须将它们全部初始化?在这里,我只需要访问一个索引,所以我初始化它。

1 个答案:

答案 0 :(得分:3)

如果@gene2refeq为空并且@array在该代码段开头之前为空,那么第53行将@gene2refeq为空。

要查找,请打印@array@gene2refeq的内容。也可能@::ids包含未初始化的值,也可以检查。添加分隔符,以便查看其中的内容。

print "\@array is ".join(", ", @array)."\n";
print "\@gene2refeq is ".join(", ", @gene2refeq)."\n";
print "\@::ids is ".join(", ", @::ids)."\n";

关于何时初始化事物的问题,声明变量和初始化之间存在差异。 myour声明一个变量在词法上和全局上分别存在。然后你可以填充(初始化)它。

程序的基本模式可能如下所示。

my @ids;
...code to populate @ids...

my @gene2refeq;
...code to populate @gene2refeq...

my @array;
...code to populate @array...

push @gene2refeq, @array;

die "\@gene2refeq is not long enough, ".join(", ", @gene2refeq)
    unless @gene2refeq >= 7;

my @prot_gi;
foreach my $id (@ids) {
    if($id == $gene2refseq[1])
    {
        push @prot_gi, $gene2refseq[6];
    }
}

其他几点。第一个foreach循环更好地写成......

push @gene2refseq, @array;

使用@::ids@::prot_gi很奇怪。这是获取@ids包中的全局变量main的简写。它不应该是必要的,闻起来像货物结果。