2016-08-18 11 views
1

最終的にList::MoreUtils::meshを使って3つの文字の配列を結合しようとしています。その結果、配列間の各位置を比較できます。 例えば、私のように見える三つのファイルがある場合:perl:メッシュ配列に沿ったスライディングウインドウの検索

>file_1 
    TAGCTAGCCAGC-T 

最初の比較はTTTの間になります(これは無置換としてカウントされます)。最初の文字がTAAの場合、これは置換文字としてカウントされます。最初の課題は、対応する3つの文字を一緒にして比較することです。ここで

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

use strict; 
    use warnings; 
    use List::MoreUtils qw{mesh}; 

    open (SEQ_ONE, "<", "/path/to/file_1.txt") or die $!; 
    open (SEQ_TWO, "<", "/path/to/file_2.txt") or die $!; 
    open (REFERENCE, "<", "/path/to/reference_sequence.txt") or die $!; 

    my @first; 
    my @second; 
    my @reference; 
    my @combined; 
    my $sequence; 
    my $secondsequence; 
    my $thirdsequence; 
    my $windowsize = 3; 
    my $step = 3; 

    while (my $line = <SEQ_ONE>){ 
      chomp $line; 
      if ($line !~ /^>+/) { 
        $sequence .= $line; 
      } 
      @first = split //, $sequence; 
    } 

    while (my $secondline = <SEQ_TWO>){ 
      chomp $secondline; 
      if ($secondline !~ /^>+/){ 
        $secondsequence .= $secondline; 
      } 
      @second = split //, $secondsequence; 
    } 

    while (my $thirdline = <REFERENCE>){ 
      chomp $thirdline; 
      if ($thirdline !~ /^>+/){ 
        $thirdsequence .= $thirdline; 
      } 
      @reference = split //, $thirdsequence; 
    } 

    @combined = mesh @reference, @first, @second; 
    my $list = "@combined"; 

    for (my $windowstart = 0; $windowstart <= (length($list) - $windowsize); $windowstart += $step){ 
      my $windowSeq = substr($list, $windowstart, $windowsize); 
      print $windowSeq, "\n"; 
    } 

これは2と1文字の長さで交互に、文字のチャンクで文字を壊すようです。私は別のウィンドウとステップサイズで実験してきたが、私はまだ時間で別々の3文字の所望の出力を得ることができません

T T 
    T 
    A A 
    A 
    G G 
    G 

:上記のコードの出力は次のように見えます。私は近づいています、ちょうどそこにはありません。助けてくれてありがとう。

+0

あなたの行 'my $ list =" @combined ";'文字列の間にスペースが追加された配列があります。私はあなたがそれを望んでいるとは確信していません - 3文字の任意のシーケンスは、1つまたは2つのスペースを持っている必要があります。あなたが 'my $ list = join '、@combined;をしたいと思うようです。 Btw、私はあなたの問題の説明を全く理解していません。 – zdim

+0

こんにちはzdim、あなたの答えをありがとう!質問を改善するにはどうすればよいですか?多分私はそれを単純化することができたかもしれません...もう一度ありがとう。 – Rob

+0

すべてのコードを書いて問題を説明したことは良いことです!しかし、あなたは "_mesh_"という言葉を使用しました。私はあなたの分野で何らかのテクニックを指していると思っていました。 (私はリンクを追加しましたが、あなたは気にしないことを願っています。)次に、 "_count as substitution_"を使って、私はそれが生物学であることを私に伝えてくれるまで、私はあなたのフィールドからの言葉を避けることをお勧めします、そして、あなたがそれらを必要とする場合、それらを簡単に説明してください。また、私は問題(文字列の余分なスペース)が表示されますが、あなたの説明からは明らかではありません。それで、説明がどのように語られているかがすべてです。私の.02。 – zdim

答えて

1

ステートメントmy $list = "@combined";は、配列要素とその間にスペースが追加された文字列を生成します。これにより、以下の処理が完全にオフになります:substr配列の二重引用符("@array")は、印刷すると読みやすくなり便利です。ここであなたが望む

my $list = join '', @combined;