2016-08-18 55 views
1

我最終嘗試使用List::MoreUtils::mesh的字母三個陣列結合,這樣我可以然後比較序列中的每個位置的滑動窗口搜索。 例如,如果我有一個看起來像三個文件:perl的:沿着網格陣列

>file_1 
    TAGCTAGCCAGC-T 

第一比較是TTT之間(這可以算作不替代)。如果第一個字母是TAA,這將被視爲替代。第一個挑戰是將三個相應的字母放在一起進行比較。

這是到目前爲止我的代碼:

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個字母長度交替。上面的代碼輸出看起來是這樣的:

T T 
    T 
    A A 
    A 
    G G 
    G 

我有不同的窗口和步長嘗試,但我仍然無法在同一時間獲得單獨三個字母所需的輸出。我很接近,只是不太在那裏。謝謝您的幫助。

+0

你的線路'my $ list =「@combined」;'數組已插入_with個空格加在characters_之間。我不確定你想要什麼 - 任何三個字符的序列都必須有一個或兩個空格。在我看來,你想'我的$ list = join',@combined;'。順便說一句,我不明白你的問題描述。 – zdim

+0

嗨zdim,謝謝你的回答!我應該如何改進我的問題?也許我可以簡化它...再次感謝。 – Rob

+0

這是很好的,你給所有的代碼和描述問題!但是,您使用了「_mesh_」這個詞,我認爲您指的是您所在領域的某種技術。 (我添加了鏈接,我希望你不介意。)然後,用「_count as substitution_」,我以爲你的意思是計算,直到它讓我意識到它是生物學。我建議你避開你的領域的條款,如果你需要他們簡要解釋他們。另外,雖然我確實看到了問題(字符串中有多餘的空格),但從描述中不清楚。所以這都是關於如何描述描述。我的$ .02。 – zdim

回答

1

聲明my $list = "@combined";產生包含陣列元件和它們之間添加空格的字符串。這在下面完全拋棄substr處理。對數組進行雙引號("@array")很方便,因此打印時更易於閱讀。在這裏你想

my $list = join '', @combined;