我收到警告:
在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 warnings
和use strict
感谢您的帮助;我刚刚宣布了@gene2refseq
并在$gene2refseq[1] = 0
之前初始化了foreach(@array)
,而且效果很好。
也感谢您在foreach
使用情况下纠正我。
如果我必须访问数组的多个索引怎么办?我是否必须将它们全部初始化?在这里,我只需要访问一个索引,所以我初始化它。
答案 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";
关于何时初始化事物的问题,声明变量和初始化之间存在差异。 my
和our
声明一个变量在词法上和全局上分别存在。然后你可以填充(初始化)它。
程序的基本模式可能如下所示。
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
的简写。它不应该是必要的,闻起来像货物结果。