匹配子串之间的距离
Distance between matched substrings
我有一个染色体序列,必须在其中找到子序列以及它们之间的距离。
例如:
字符串:
AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT
子字符串:
ACGT
我必须找出所有出现的 ACGT
之间的距离。
您可以 split
您的输入字符串 "ACGT"
并删除返回数组的第一个和最后一个元素以获得 "ACGT"
之间的所有片段。然后计算这个片段的长度:
my $input = "AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT";
my @fragments = split("ACGT", $input, -1);
@fragments = @fragments[1..$#fragments - 1];
my @dist_arr = map {length} @fragments;
我通常不建议回复显然 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);
此方法比拆分原始字符串使用的内存更少(如果原始字符串足够大,这可能是个问题)。它的内存占用可以进一步减少,但我通过分别显示匹配位置的累积和增量计算来关注清晰度。
一个悬而未决的问题是您是否想要从字符串开头开始的第一个匹配项的索引。严格来说,"distances between matches" 不包括那个。
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
来做,只是这样比较难看。
我有一个染色体序列,必须在其中找到子序列以及它们之间的距离。
例如:
字符串:
AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT
子字符串:
ACGT
我必须找出所有出现的 ACGT
之间的距离。
您可以 split
您的输入字符串 "ACGT"
并删除返回数组的第一个和最后一个元素以获得 "ACGT"
之间的所有片段。然后计算这个片段的长度:
my $input = "AACCGGTTACGTTTGGCCAAACGTTTTTTGGGGAAACCCACGTACGTAAAGCCGGTTAAACGT";
my @fragments = split("ACGT", $input, -1);
@fragments = @fragments[1..$#fragments - 1];
my @dist_arr = map {length} @fragments;
我通常不建议回复显然 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);
此方法比拆分原始字符串使用的内存更少(如果原始字符串足够大,这可能是个问题)。它的内存占用可以进一步减少,但我通过分别显示匹配位置的累积和增量计算来关注清晰度。
一个悬而未决的问题是您是否想要从字符串开头开始的第一个匹配项的索引。严格来说,"distances between matches" 不包括那个。
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
来做,只是这样比较难看。