2016-08-11 5 views
0

各ファイルに2行のシーケンスを含むディレクトリ内のファイルを開きます。上のシーケンスは下のシーケンスよりも長いが、下のシーケンスを含む。私は、一番上のシーケンスに見つかったら、各方向に2つの隣接する文字で下のシーケンスを拡張したいと思います。私は正規表現のマッチを行うことでこれを試していますが、$ newsequence変数の初期化されていないエラーが発生しています。ここ は、一般的なファイルは次のようになります。変数への正規表現検索の割り当て:初期化されていない変数エラー

>CCCCNNNNNCCCC 
    NNNNN 

私は1つのファイルに次の形式のすべてのシーケンスを印刷したいと思います:ここで

>CCCCNNNNNCCCC 
    CCNNNNNCC 

は、これまでの私のコードです:

use strict; 
    use warnings; 

    my ($directory) = @ARGV 
    my @array = glob "$directory/*"; 
    my $header; 
    my $sequence; 
    my $newsequence; 

    open(OUT, ">", "/path/to/out.txt") or die $!; 
    foreach my $file (@array){ 
     open (my $fh, $file) or die $!; 
     while (my $line = <$fh>){ 
      chomp $line; 
      if ($line =~ /^>/) { 
       $header = $line; 
      } elsif ($line =~ /^[CN]/) { 
       $sequence = $line; 
      } 
      my ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/; 
     } 
     print OUT $header, "\n", $newsequence, "\n"; 
    } 

適切な出力を得るために$ newsequenceへの正規表現の割り当てを改善するにはどうすればよいですか?ありがとう。

+0

どの変数が初期化されていませんか? – Barmar

+0

正確な警告メッセージは何ですか? – melpomene

+0

Barmar- $ newsequence変数は初期化されていません。私はその情報を含めるために私の質問を改善します。 zdim-上のシーケンスで見つかったときに、どちらの側でもボトムシーケンスに隣接する2つの文字を取ります。私もそれを明らかにするでしょう。ありがとう。 – Rob

答えて

2

この行は間違っている:

my ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/; 

myキーワードがメインスクリプトに変数を割り当てていない、whileループに新しい変数$newsequenceローカルに作成しています。したがって、ループが完了した後に$newsequenceと書き込むと、変数はまだ初期化されていません。

ステートメントをwhileループ内に配置するか、この割り当てでmyキーワードを削除してください。

また、その割り当てステートメントをelseifブロック内に配置する必要があります。それ以外の場合は、割り当てを行う前に$sequenceを使用してみます。あなたの条件は(各ファイルはわずか2行が含まれ、シーケンスは常にヘッダーで発見された)正確であるならば、あなたはあなたのコードはずっと簡単にすることができ

foreach my $file (@array){ 
    open (my $fh, $file) or die $!; 
    while (my $line = <$fh>){ 
     chomp $line; 
     if ($line =~ /^>/) { 
      $header = $line; 
     } elsif ($line =~ /^[CN]/) { 
      $sequence = $line; 
      ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/; 
      print OUT $header, "\n", $newsequence, "\n"; 
     } 
    } 

} 
+0

ブリリアント。ありがとう! – Rob

0

含む:だから全体のことは次のようになります。正規表現:

for my $file (@array) { 
    open (my $fh, $file) or die $!; 
    chomp ((my $header, my $sequence) = <$fh>); 
    $header =~ /(..)$sequence(..)/; 
    print OUT "$header\n$1$sequence$2"; 
} 
関連する問題