2010-11-24 6 views

Répondre

4

Je pense qu'ils sont un peu là pour rester, d'une manière ou l'autre - en particulier le code échappe. Les fuites de code ont été avec nous pendant plus d'une décennie.

d'entre eux La frayeur - qu'ils peuvent appeler le code de façon imprévisible - est pris en charge par use re "eval". De plus, le regex matcher n'a pas été ré-introduit avant 5.12 IIRC, ce qui pourrait limiter leur utilité.

La version chaîne-évaluation, (??{ code }), était la seule façon de faire de la récursivité, mais depuis 5.10, nous avons une bien meilleure façon de faire cela; L'analyse comparative des différences de vitesse montre que la méthode d'évaluation est beaucoup plus lente dans la plupart des cas.

J'utilise principalement la version de bloc-eval, (?{ code}), pour ajouter le débogage, ce qui arrive à une granualarité différente de use re "debug". Ça me dérange vaguement que la valeur de retour de la version de bloc eval était pas utilisable, jusqu'à ce que je compris qu'il était . Il fallait juste l'utiliser comme une partie de test d'un modèle conditionnel, comme ce modèle pour tester si un nombre est composé de chiffres qui diminuaient par une chaque position à droite:

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

Avant que j'ai compris conditionnels, j'aurais écrit que de cette façon:

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

ce qui est beaucoup moins efficace.

Les verbes de contrôle des retours en arrière sont plus récents. Je les utilise principalement pour obtenir toutes les permutations possibles d'un match, et cela nécessite seulement (*FAIL). Je crois que c'est la caractéristique (*ACCEPT) qui est particulièrement marquée "hautement expérimentale". Ceux-ci ont seulement été avec nous depuis 5.10.

+0

({ord $ 3 == 1 + ord $ 2}): ce que cela arrête la regex si ce n'est pas vrai? –

+0

@sid_com: Il teste true, en prenant la branche '(? 1)' si c'est le cas et le '$' sinon. – tchrist

Questions connexes