2010-11-24 84 views

回答

4

我有點覺得他們在這裏留下來,一種方式或其他 - 特別是代碼轉義。代碼轉義已經和我們在一起十多年了。

他們的scar - - 他們可以以不可預見的方式調用代碼 - 由use re "eval"負責。此外,直到5.12 IIRC,正則表達式匹配器還沒有被重新使用,這可能會限制它們的用處。

string-eval版本(??{ code })曾經是遞歸的唯一方法,但自從5.10版本以來,我們有更好的方法來做到這一點;對速度差異進行基準測試表明,在大多數情況下,評估方式是較慢的。

我主要使用block-eval版本(?{ code})來添加調試,這種調試發生在與use re "debug"不同的粒度。它曾經隱約打擾我,從塊評估版本的返回值是不可用的,直到我意識到它。你只是不得不使用它作爲一個條件模式的測試部分,這樣的模式來測試一個數字是否是由這是一個每個位置下降到正確的數字了:

qr{ 
^(
     (\p{Decimal_Number}) 
     (?(?= (\d)) | $) 
     (?(?{ ord $3 == 1 + ord $2 }) (?1) | $) 
    ) $ 
}x 

之前,我想通了條件,我會這樣寫:

qr{ 
^( 
     (\p{Decimal_Number}) 
     (?= $ | (??{ chr(1+ord($2)) })) 
     (?: (?1) | $) 
    ) $ 
}x 

這是效率低得多。

回溯控制動詞更新。我主要用它們來獲得所有可能的比賽排列,並且只需要(*FAIL)。我相信這是(*ACCEPT)功能,特別標記爲「高度實驗性」。這些只是自5.10以來一直與我們在一起。

+0

(?{ord $ 3 == 1 + ord $ 2}):這是否停止正則表達式,如果它不是真的? – 2010-11-24 14:56:54