我无法访问哈希值

时间:2013-01-15 21:24:30

标签: arrays perl hash bioinformatics fasta

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

2 个答案:

答案 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/>/) ...