2016-08-18 30 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;