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
我有不同的窗口和步长尝试,但我仍然无法在同一时间获得单独三个字母所需的输出。我很接近,只是不太在那里。谢谢您的帮助。
你的线路'my $ list =“@combined”;'数组已插入_with个空格加在characters_之间。我不确定你想要什么 - 任何三个字符的序列都必须有一个或两个空格。在我看来,你想'我的$ list = join',@combined;'。顺便说一句,我不明白你的问题描述。 – zdim
嗨zdim,谢谢你的回答!我应该如何改进我的问题?也许我可以简化它...再次感谢。 – Rob
这是很好的,你给所有的代码和描述问题!但是,您使用了“_mesh_”这个词,我认为您指的是您所在领域的某种技术。 (我添加了链接,我希望你不介意。)然后,用“_count as substitution_”,我以为你的意思是计算,直到它让我意识到它是生物学。我建议你避开你的领域的条款,如果你需要他们简要解释他们。另外,虽然我确实看到了问题(字符串中有多余的空格),但从描述中不清楚。所以这都是关于如何描述描述。我的$ .02。 – zdim