在Perl正則表達式中,我怎樣才能從/ ge循環中斷開?從Perl中的正則表達式循環中打破
假設代碼:
s/\G(foo)(bar)(;|$)/{ break if $3 ne ';'; print "$1\n"; '' }/ge;
... break
這裏不起作用,但它應該說明我的意思。
在Perl正則表達式中,我怎樣才能從/ ge循環中斷開?從Perl中的正則表達式循環中打破
假設代碼:
s/\G(foo)(bar)(;|$)/{ break if $3 ne ';'; print "$1\n"; '' }/ge;
... break
這裏不起作用,但它應該說明我的意思。
一般來說,我會寫這是一個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"
如果我知道你的具體情況,我可以提供一個更有幫助的例子。
這實際上幫助很大!謝謝... – 2012-03-28 16:50:15
您可以使用一些實驗功能來模擬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
爲假時,它匹配。
非常有趣!謝謝! – 2012-03-28 21:18:25
正則表達式不匹配時會不會自動停止?你想達到什麼目的? – 2012-03-28 16:22:25
@JeffB - 我寫了一個可能是錯誤的例子 - 這個想法是能夠在它自動停止之前停止解析... – 2012-03-28 16:25:46
由於某些原因,對於最近的Perl來說這是一個很大的障礙 - 非新手可以克服做任何事情的想法在一個聲明中(通常在匹配或替換運算符中)。 :) – 2012-03-28 18:42:42