我有一个染色体序列,必须找到它的子序列和它们之间的距离。
例如:
的字符串:
AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT
子串:
ACGT
我必须找到ACGT
所有出现的距离。
答案 0 :(得分:1)
我通常不建议回答那些显然OP只是希望其他人开展工作的帖子。但是,如果输入字符串较大,那么已经有一个答案可能会出现问题,因此这里使用的是Perl内置函数。
特殊变量@-
存储模式匹配后匹配的位置。
use strict;
use warnings;
use Data::Dumper;
my $string = 'AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT';
my @pos;
while ( $string =~ /ACGT/g ) {
push @pos, $-[0];
}
my @dist;
for my $i (1 .. $#pos) {
push @dist, $pos[$i] - $pos[$i - 1];
}
print Dumper(\@pos, \@dist);
此方法使用的内存少于拆分原始字符串(如果原始字符串足够大,则可能会出现问题)。它的内存占用量可以进一步减少,但我通过分别显示匹配位置的累积和增量的计算来关注清晰度。
一个悬而未决的问题是,您是否希望从字符串的开头开始第一个匹配的索引。严格来说,“匹配之间的距离”排除了这一点。
use strict;
use warnings;
use Data::Dumper;
my $string = 'AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT';
my @dist;
my $last;
while ($string =~ /ACGT/g) {
no warnings 'uninitialized';
push @dist, $-[0] - $last;
$last = $-[0];
}
# Do we want the distance of the first
# match from the beginning of the string?
shift @dist;
print Dumper \@dist;
当然,也可以使用index
,但看起来更加丑陋。
答案 1 :(得分:0)
您可以通过split
"ACGT"
输入字符串,并删除返回数组的第一个和最后一个元素,以获取"ACGT"
之间的所有片段。然后计算这些片段的长度:
my $input = "AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT";
my @fragments = split("ACGT", $input, -1);
@fragments = @fragments[1..$#fragments - 1];
my @dist_arr = map {length} @fragments;