匹配的子串之间的距离

时间:2017-05-15 09:57:37

标签: string perl substring distance

我有一个染色体序列,必须找到它的子序列和它们之间的距离。

例如:

的字符串:

  

AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT

子串:

  

ACGT

我必须找到ACGT所有出现的距离。

2 个答案:

答案 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;

演示:https://ideone.com/AqEwGu