2013-11-25 50 views

回答

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

無需正則表達式,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"; 
相關問題