0

我有一个程序可以在解析 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;

我的问题是当线路

打印 $arrayOfHashes[0]{id};

被调用,我收到一条错误消息

在 fasta_tie.pl 第 47 行第 6670 行的打印中使用未初始化的值。

你会在上面的代码中看到我注释掉了一行,上面写着

推(@arrayOfHashes,“$i”);

因为我想确保哈希有效。此外,数据以所需的格式正确打印。看起来像这样

HLA:HLA00127:A*74:01:2918

4

2 回答 2

1

尝试添加

print "Array length:" . scalar(@arrayOfHashes) . "\n"; 

print $arrayOfHashes[0]{id};

所以你可以看到,如果你的变量中有一些内容。您还可以使用模块Data::Dumper来查看内容。

use Data::Dumper;
print Dumper(\@arrayOfHashes);

注意数组前的'\'!

输出将类似于:

$VAR1 = [ { 'sequence' => 'tempSequence', 'hla' => 'hla', 'bpCount' => 'bpCount', 'id' => 'id' } ];

但如果有 Fasta 的模块,请尝试使用它。您不必每次都重新发明轮子;)

于 2013-01-15T21:47:28.600 回答
1

首先你这样做:

 $fileArray[$i] =~ s/>//;

然后稍后您尝试像这样匹配:

$fileArray[$i++] =~ m/>/

您逐步浏览文件数组,删除每行中的第一个“大于”符号。然后你想用同一个字符匹配当前行。如果您只想在第二个“大于”的情况下推送该行,那将是可以的,但是如果您只期望 1,或者结果只有一个,您将永远不会将任何内容推送到数组中。

  • 您的评论“将 i 放回当前行”显示了您要执行的操作,但是如果您只使用一次,为什么不使用该表达式$i + 1

  • 另外,因为您在修复后增加它并且没有将它用于任何事情,所以您的增量没有效果。如果$i==0之前,则$fileArray[$i++] 仍然访问$fileArray[0],仅$i==1在对表达式求值之后 - 并且没有效果 - 直到后来被递减。

如果你想向前看,那么最好使用前缀增量:

if ($fileArray[++$i] =~ m/>/) ...
于 2013-01-15T21:49:50.803 回答