2016-07-22 5 views
0

私は、タブで区切られたシーケンスを含む入力ファイルを扱っています。一連のグループは改行で区切られています。ファイルには、次のようになります。ハッシュに存在するキーの数を数えるには?

use strict; 
    use warnings; 

    open(INFILE, "<", "/path/to/infile.txt") or die $!; 

    my %hash = ( 
      TAGC => 'THIS_EXISTS', 
      GCTA => 'THIS_DOESNT_EXIST', 
    ); 

    while (my $line = <INFILE>){ 
      chomp $line; 
      my $hash; 
      my @elements = split "\t", $line; 
      open my $out, '>', "/path/to/outfile.txt" or die $!; 
      foreach my $sequence(@elements){ 
        if (exists $hash{$sequence}){ 
         print $out ">$sequence\n$hash{$sequence}\n"; 
        } 
        else 
        } 
         $count++; 
         print "Doesn't exist ", $count, "\n"; 
        } 
      } 
    } 

どのように私は印刷する前に存在してどのように多くのシーケンス伝えることができます:ここで

TAGC  TAGC  TAGC  HELP 
    TAGC  TAGC  TAGC 
    TAGC  HELP 
    TAGC 

は、私が持っているコードはありますか?その情報を出力ファイルの名前に入れる必要があります。

理想的には、ファイルの名前に含めることができる変数があります。残念ながら、@elementsのスカラーを取ることはできません。なぜなら、いくつかのシーケンスが出力されないからです。配列に存在するキーをプッシュしてその配列のスカラーを印刷しようとすると、私はまだ必要な結​​果を得られません。ここで私が試したことがあります(グローバルにする必要がある変数はすべてです)。

open my $out, '>', "/path/to/file.$number.txt" or die $!;  
    foreach my $sequence(@elements){ 
      if (exists $hash{$sequence}){ 
        push(@Array, $hash{$sequence}, "\n"); 
        my $number = @Array; 
        print $out ">$sequence\n$hash{$sequence}\n"; 
      #.... 

ありがとうございました。心から感謝する。

答えて

2
my $sequences = grep exists $hash{$_}, @elements; 
open my $out, '>', "/path/to/outfile_containing_$sequences.txt" or die $!; 

リスト・コンテキストでは、grepはリストを基準でフィルタリングします。スカラコンテキストでは、基準に合致した要素の数を返します。

+0

これは素晴らしいです。ありがとう。 – Rob

0

最も簡単な方法は、変数に印刷するキーの数を記録し、ループが終了したら、計算した数値でファイルの名前を変更することです。 Perlには、これを行うための組み込み関数が付属しています。

use strict; 
use warnings; 

open(INFILE, "<", "/path/to/infile.txt") or die $!; 

my %hash = ( 
     TAGC => 'THIS_EXISTS', 
     GCTA => 'THIS_DOESNT_EXIST', 
); 
my $ammt; 

while (my $line = <INFILE>){ 
     chomp $line; 
     my $hash; 
     my @elements = split "\t", $line; 
     open my $out, '>', "/path/to/outfile.txt" or die $!; 
     foreach my $sequence(@elements){ 
       if (exists $hash{$sequence}){ 
        print $out ">$sequence\n$hash{$sequence}\n"; 
        $ammt++; 
       } 
       else 
       } 
       print "Doesn't exist ", $count, "\n"; 
       } 
     } 
} 

rename "/path/to/outfile.txt", "/path/to/outfile${ammt}.txt" or die $!; 

それは(厳密にはそのことについて文句を言うでしょう)あなたのコード内で宣言されていないので、私は、$count変数を削除:コードは次のようなものになるだろう。 Here'srenameの公式文書。 TrueまたはFalseを返すので、成功したかどうかを確認できます。ところで

、ということに注意してください。

push(@Array, $hash{$sequence}, "\n"); 

2つの項目($hash{$sequence}\n)を格納しているので、それがあるべきように、その数は二倍になります。

関連する問題