我有一个程序在解析FASTA文件时创建一个哈希数组。这是我的代码
use strict;
use warnings;
my $docName = "A_gen.txt";
my $alleleCount = 0;
my $flag = 1;
my $tempSequence;
my @tempHeader;
my @arrayOfHashes = ();
my $fastaDoc = open(my $FH, '<', $docName);
my @fileArray = <$FH>;
for (my $i = 0; $i <= $#fileArray; $i++) {
if ($fileArray[$i] =~ m/>/) { # creates a header for the hashes
$flag = 0;
$fileArray[$i] =~ s/>//;
$alleleCount++;
@tempHeader = split / /, $fileArray[$i];
pop(@tempHeader); # removes the pointless bp
for (my $j = 0; $j <= scalar(@tempHeader)-1; $j++) {
print $tempHeader[$j];
if ($j < scalar(@tempHeader)-1) {
print " : "};
if ($j == scalar(@tempHeader) - 1) {
print "\n";
};
}
}
# push(@arrayOfHashes, "$i");
if ($fileArray[$i++] =~ m/>/) { # goes to next line
push(@arrayOfHashes, {
id => $tempHeader[0],
hla => $tempHeader[1],
bpCount => $tempHeader[2],
sequence => $tempSequence
});
print $arrayOfHashes[0]{id};
@tempHeader = ();
$tempSequence = "";
}
$i--; # puts i back to the current line
if ($flag == 1) {
$tempSequence = $tempSequence.$fileArray[$i];
}
}
print $arrayOfHashes[0]{id};
print "\n";
print $alleleCount."\n";
print $#fileArray +1;
我的问题是行
print $ arrayOfHashes [0] {id};
被调用,我收到错误消息
在fasta_tie.pl第47行第6670行打印时使用未初始化的值。
您将在上面的代码中看到我注释掉了一行
推送(@arrayOfHashes,“$ i”);
因为我想确保散列有效。数据也正确打印出来 想要的格式。看起来像这样
HLA:HLA00127:A * 74:01:2918
答案 0 :(得分:1)
尝试添加
print "Array length:" . scalar(@arrayOfHashes) . "\n";
之前
print $arrayOfHashes[0]{id};
所以你可以看到,如果你的变量中有一些内容。您还可以使用模块Data::Dumper查看内容。
use Data::Dumper;
print Dumper(\@arrayOfHashes);
注意数组前的'\'!
输出类似于:
$ VAR1 = [ { 'sequence'=&gt; 'TEMPSEQUENCE', 'hla'=&gt; 'HLA', 'bpCount'=&gt; 'bpCount', 'id'=&gt; 'ID' } ];
但是如果有Fasta模块,请尝试使用它。您不必每次都重新发明轮子;)
答案 1 :(得分:1)
首先你这样做:
$fileArray[$i] =~ s/>//;
然后你会尝试像这样匹配:
$fileArray[$i++] =~ m/>/
您逐步浏览文件数组,删除每行上第一行“大于”的符号。然后你想用同一个字符匹配当前行。如果你只想在第二个“大于”的情况下推动该行,那就没关系了,但如果你只期望1,那么你永远不会把任何东西推到数组中,或者结果是只有一个。
您的评论“让我回到当前行”会显示您要执行的操作,但如果您只使用一次,为什么不使用表达式$i + 1
?
此外,因为您正在递增 post-fix 而不是将其用于任何内容,所以您的增量无效。如果之前有$i==0
,那么$fileArray[$i++]
仍然访问$fileArray[0]
,在评估表达式后只有$i==1
- 并且无效 - 直到后来减少。
如果你想提前偷看,那么最好使用预修复增量:
if ($fileArray[++$i] =~ m/>/) ...