2010-09-27 48 views
0

我有一個包含多個子串的字符串,每個子串包含一個或多個'E'字符。我試圖使用Perl和正則表達式來獲得每個這些sustrings的座標。這是我第一次嘗試的。查找子串的邊界

#!/usr/bin/perl 
use strict; 

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG"; 
foreach my $match($str =~ m/(E+)/) 
{ 
    print "match: $match, coords: (". $-[0] .", ". $+[0] .")\n"; 
} 

端子輸出看起來像這樣...

> ./test 
match: EE, coords: (5, 7) 

所以它成功地找到第一個字符串。但我想識別每個子字符串。所以我像這樣在正則表達式中添加了'g'修飾符...

#!/usr/bin/perl 
use strict; 

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG"; 
foreach my $match($str =~ m/(E+)/g) 
{ 
    print "match: $match, coords: (". $-[0] .", ". $+[0] .")\n"; 
} 

它給出了以下終端輸出。

> ./test 
match: EE, coords: (20, 21) 
match: E, coords: (20, 21) 
match: EEE, coords: (20, 21) 
match: E, coords: (20, 21) 

正如你所看到的,它找到了正確的每個子字符串,但我只是拉出最後一場比賽的座標。也許我正在使用$ - 和$ +不正確?任何想法如何我可以正確地抓住這些座標?謝謝。

回答

5

foreach首先建立匹配列表,然後然後遍歷它們。此時,@-@+僅包含來自上次比賽的數據。嘗試:

#!/usr/bin/perl 
use strict; 

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG"; 
while ($str =~ m/(E+)/g) 
{ 
    printf "match: %s, coords: (%d, %d)\n", $1, $-[0], $+[0]; 
} 
+0

謝謝,這就是它。我實際上最初嘗試的是while而不是foreach,但是在正則表達式中沒有g,這是一個無限循環。謝謝你帶我去休息吧! – 2010-09-27 21:05:02

+0

@Daniel Standage,是的,沒有'/ g'它總是找到第一個匹配,所以只要'$ str'包含一個E就重複循環。如果你不修改循環中的$ str。 。 無限循環。 – cjm 2010-09-27 21:07:21