需要一个在Perl中执行此操作的函数

时间:2013-11-25 09:45:28

标签: perl

示例输入:

ATAT

GATATATGCATATACTT

示例输出:

1 3 9

我得到了正则表达式部分,但我不明白我们如何使用位置实例。

2 个答案:

答案 0 :(得分:3)

内置数组@-保存最后一个成功的正则表达式及其捕获在目标字符串中出现的位置。因此,$-[0]表示整个模式匹配的位置,而$-[1]等表示捕获$1等的位置。

与此相结合,您需要使用前瞻而不是简单的正则表达式,否则正则表达式引擎将在结束后开始查找后续匹配它找到的上一场比赛的结果,因此不会发现重叠事件。

此代码将按您的要求执行。

use strict;
use warnings;

my $seq = 'GATATATGCATATACTT';

my @offsets;
push @offsets, $-[0] while $seq =~ /(?=ATAT)/g;
print "@offsets\n";

<强>输出

1 3 9

答案 1 :(得分:1)

不需要正则表达式,index可以完成所有工作:

#!/usr/bin/perl
use warnings;
use strict;

my $substring = 'ATAT';
my $string    = 'GATATATGCATATACTT';

my @positions;
my $pos = -1;
while (-1 != ($pos = index $string, $substring, $pos + 1)) {
    push @positions, $pos;
}
print "@positions\n";