perl: 沿网格数组滑动 window 搜索

perl: sliding window search along mesh array

我最终尝试使用 List::MoreUtils::mesh 组合三个字母数组,这样我就可以比较序列中的每个位置。 例如,如果我有如下所示的三个文件:

    >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  

我尝试了不同的 window 和步长,但我仍然无法一次获得所需的单独三个字母的输出。我很接近,只是不完全在那里。谢谢您的帮助。

语句my $list = "@combined"; 生成一个字符串,其中包含数组元素和在它们之间添加的空格。这完全摆脱了下面的 substr 处理。双引号数组 ("@array") 很方便,这样打印时更容易阅读。给你

my $list = join '', @combined;