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;
我最终尝试使用 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;