2010-11-24 5 views

Antwort

4

Ich glaube irgendwie, dass sie hier sind, um zu bleiben, auf die eine oder andere Weise - vor allem Code entkommt. Code Escapes begleiten uns seit mehr als einem Jahrzehnt.

Die Unheimlichkeit von ihnen - dass sie Code in unvorhergesehenen Wegen aufrufen können - wird von use re "eval" betreut. Auch der Regex-Matcher war bis 5.12 IIRC nicht relevant, was ihre Nützlichkeit einschränken könnte.

Die string-eval-Version, (??{ code }), war früher der einzige Weg, eine Rekursion durchzuführen, aber seit 5.10 haben wir einen viel besseren Weg, dies zu tun; Benchmarking der Geschwindigkeitsunterschiede zeigt, dass der Evaluierungsweg in den meisten Fällen viel langsamer ist.

Ich verwende meistens die Block-Evaluierungsversion, (?{ code}), um Debugging hinzuzufügen, was bei einer anderen Granularität als use re "debug" geschieht. Es hat mich vage gestört, dass der Rückgabewert von der Block-Evaluierungsversion nicht verwendbar war, bis ich feststellte, dass war. Sie musste es einfach als Test Teil eines bedingten Muster verwenden, wie dieses Muster für die Prüfung, ob eine Zahl wurde von Ziffern aus, die auf der rechten Seite durch eine jede Position abnehmend wurden:

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

Bevor ich heraus Ich hätte das so geschrieben:

was viel weniger effizient ist.

Die Backtracking-Kontrollverben sind neuer. Ich benutze sie hauptsächlich, um alle möglichen Permutationen eines Matches zu erhalten, und das erfordert nur (*FAIL). Ich glaube, es ist die Funktion, die besonders "hoch experimentell" markiert ist. Diese sind erst seit 5.10 bei uns.

+0

(? {Ord $ 3 == 1 + ord $ 2}): stoppt dies die Regex, wenn es nicht wahr ist? –

+0

@sid_com: Es prüft auf wahr, nimmt den '(? 1)' Zweig wenn ja und den '$' wenn nicht. – tchrist

Verwandte Themen