2012-08-09 14 views
0

我是新手用Perl,但我在想,如果我創建捕獲,甚至是其他種類的副作用,如代碼斷言正則表達式變量會發生什麼,然後用插入插入這個正則表達式到一個更大的正則表達式組成,然後再重複這個過程?的Perl:編寫正則表達式通插值時的Subexpr具有捕捉

它是一個爛攤子,甚至可以控制哪些最終組成確實在副作用方面的行爲?有這方面的文件嗎?

+3

歡迎來到Perl!你能舉一個你在短代碼片段中的意思嗎?我想我可能會知道你在問什麼,但沒有我的假設可能會更好。 – zostay 2012-08-09 17:06:23

+2

如果您想知道,請繼續嘗試。通過反覆試驗來學習比讓別人向你提供答案要好得多。 – 2012-08-09 17:07:06

+0

就捕獲而言,如果你使用命名捕獲(而不是編號),並且你沒有任何名稱衝突,那麼這應該是可能的工作方式,應該是一般的和非常不贊同的。 – 2012-08-09 17:19:07

回答

-1

您的意思是?是的,你可以。

然而,更好的辦法是使用qr幫助建立正則表達式:

my $re_name = qr(^) . qr(bob) . qr(\s); 
while ($name_from_file = <STDIN>) { 
    chomp $name_from_file; 
    if ($name_from_file =~ /$re_name/i) 
    print "I got something for $name!\n"; 
} 

這樣,你的正則表達式可以更容易地插你的變量。

0

有大量的documentation這一點,並且它與Perl的。 :)

首先,內插發生的Perl處理該模式的字符之前。 Understand the order of operations in double quoted contexts。插入字符串中的任何特殊字符仍然是特殊的。

要回答你的問題,你必須要嘗試一下。

use v5.10; 

my $start = qr/(Buster|Mimi)/; 
say "Starting regex --> $start"; 

my $middle = qr/My (cat is $start)/i; 
say "Middle regex --> $middle"; 

my $end = qr/Find \s+ "$middle"/x; 
say "End regex --> $end"; 

這表明,每個正則表達式被嵌入在較大的一個,保留了其選項。

Starting regex --> (?^:(Buster|Mimi)) 
Middle regex --> (?^i:My (cat is (?^:(Buster|Mimi)))) 
End regex --> (?^x:Find \s+ "(?^i:My (cat is (?^:(Buster|Mimi))))") 

捕獲的規則在每個級別都是相同的。它們由開頭捕獲括號的順序決定。 Perl不會讓你跟蹤任何類型的嵌套或「誰先到達那裏」。如果您不想跟蹤編號的捕獲變量,則可以使用命名捕獲。