2012-03-28 66 views
1

在Perl正則表達式中,我怎樣才能從/ ge循環中斷開?從Perl中的正則表達式循環中打破

假設代碼:

s/\G(foo)(bar)(;|$)/{ break if $3 ne ';'; print "$1\n"; '' }/ge; 

... break這裏不起作用,但它應該說明我的意思。

+2

正則表達式不匹配時會不會自動停止?你想達到什麼目的? – 2012-03-28 16:22:25

+0

@JeffB - 我寫了一個可能是錯誤的例子 - 這個想法是能夠在它自動停止之前停止解析... – 2012-03-28 16:25:46

+1

由於某些原因,對於最近的Perl來說這是一個很大的障礙 - 非新手可以克服做任何事情的想法在一個聲明中(通常在匹配或替換運算符中)。 :) – 2012-03-28 18:42:42

回答

6

一般來說,我會寫這是一個while聲明:

while(s/(foo)(bar)/$1/) { 
    # my code to determine if I should stop 
    if(something) { 
     last; 
    } 
} 

用這種方法需要注意的是,你的查找/替換在開始每一次,這可能取決於你的正則表達式的問題將開始。

如果你真的想這樣做的正則表達式,你可以,如果你達到了你的終點,編寫返回未修改的字符串的函數,例如在這種情況下,計數:

my $count=0; 

sub myfunc { 
    my ($string, $a, $b) = @_; 

    $count++; 

    if($count > 3) { 
     return $string; 
    } 

    return $a; 
} 

$mystring = "foobar foobar, foobar + foobar and foobar"; 
$mystring =~ s/((foo)(bar))/myfunc($1,$2,$3)/ge; 

# result: $mystring => "foo foo, foo + foobar and foobar" 

如果我知道你的具體情況,我可以提供一個更有幫助的例子。

+0

這實際上幫助很大!謝謝... – 2012-03-28 16:50:15

1

您可以使用一些實驗功能來模擬break語句,其中一些功能的Perl文檔警告說他們可能會在將來的Perl版本中進行更改。

my $str = "abcdef"; 
my $stop = 0; 
$str =~ s/(?(?{ $stop })(?!))(.)/ $stop = 1 if $1 ge "c"; "X" /ge; 
print "$str\n"; 

這將打印XXXdef

一塊明智的解釋:

  • (?(condition)yes-pattern)如果該模式在condition比賽再搭配yes-pattern,否則不匹配任何內容。
  • (?{ code })執行code,內部條件如果代碼是真正的執行yes-pattern
  • (?!)永遠不匹配,它的意思是像「沒什麼不匹配」,自「無」可以在任何匹配指向一個字符串將失敗。

因此,當$stop爲真時,該模式永遠不會匹配,並且當$stop爲假時,它匹配。

+0

非常有趣!謝謝! – 2012-03-28 21:18:25