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;

私の問題は、

print $ arrayOfHashes [0] {id};

が呼び出されると、次のようなエラーが発生します

fasta_tie.pl行47、行6670の印刷での初期化されていない値の使用。

上記のコードで、私が次のような行をコメントアウトしたことがわかります。

push(@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/>/

ファイル配列をステップ実行し、各行の行の最初の「大なり記号」を削除します。次に、現在の行を同じ文字で一致させます。2番目の「より大きい」がある場合にのみ行をプッシュしたい場合は問題ありませんが、1つしか期待できない場合、または1つしかない場合は、配列に何もプッシュしません。

  • 「現在の行に戻す」というコメントは、あなたがやろうとしていたことを示していますが、一度だけ使用する場合は、式を使用してみません$i + 1か?

  • また、修正後にインクリメントし、何にも使用しないため、インクリメントは効果がありません$i==0以前の場合は、式が評価された後、後でデクリメントされるまで、効果がない場合にのみ、にアクセスし$fileArray[$i++] ます。$fileArray[0]$i==1

先を見越したい場合は、プレフィックス増分を使用することをお勧めします。

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