11
votes

Perl: Comment obtenir le regex initial de la version précompilée?

Code simple:

(?^u:(?^u:(?^u:(?^u:(?^u:^\w$)))))
  • Lisez-le Li>
  • Compilez-le LI>
  • sauvegardez-le dans le fichier pour l'utilisation ultérieure. LI> ul>

    mais je ne peux pas enregistrer le regex compilé pour l'utilisation ultérieure, car dans chaque compilation, la regex a été étendue avec le (? ^ u :, donc après plusieurs cycles, je suis terminé par: P> xxx pré>

    Par conséquent, la question est la suivante: p>

    • est ici une manière correcte, comment enregistrer la version compilée? LI>
    • Si aucun moyen - comment décompiler, pour obtenir la version originale? LI>
    • n'importe quelle idée? li> ul> p>


1 commentaires

Vous dites que vous avez lu le modèle à partir d'un fichier, vous avez donc ce que vous voulez enregistrer dans un fichier, alors pourquoi ne pas l'enregistrer?


4 Réponses :


4
votes

1 commentaires

Il suffit de lire que voici une autre réponse pour «l'utilisation de ...». Thanx Daxim aussi - malheureusement accepter un seul ..



15
votes

Bien que je voudrais simplement conserver la copie de la chaîne autour de l'utilisation des données, puis compiler une copie lorsque je devais l'utiliser, vous pouvez également utiliser le Regexp_pattern fonction du module CORE RE Pour renvoyer le motif utilisé pour créer une regex compilée: xxx

impression xxx


4 commentaires

C'est exactement ce dont j'ai besoin. Travailler avec Perl au-dessus de 5,10 - si bien ...;) Thanx!


Ce n'est pas ce qu'il imprime, du moins pas en 5.14.


@ikegami => J'ai 5.10.1 ici au travail, et c'est exactement ce qu'il imprime. En outre, il n'a pas échoué pour qr / foo \ / bar / il renvoie simplement une valeur qui ne répond pas à ceux qui citent des caractères ...


De la documentation sur REGEXP_PATTERN : dans la liste contextuelle, il renvoie une liste de deux éléments, la premier élément contenant le motif et la seconde contenant les modificateurs utilisés lorsque le motif a été compilé. Lorsque vous testez, j'ai trouvé que les deux exemples mentionnés ci-dessus imprimer une liste, où le deuxième élément est u u .



0
votes

Peut-être aussi simple que: xxx


1 commentaires

Méfiez-vous, Version incohérente: Stackoverflow.com/q/8082617#COMMENT-10190574



3
votes

L'original est un opérateur em>, pas un motif de regex. En ce qui concerne la première valeur renvoyée par regexp_pattern code> (le modèle) entraîne une perte d'informations. Vous devez également regarder le second (les drapeaux).

use re qw( regexp_pattern );
my ($pat, $flags) = regexp_pattern($re);
$pat =~ s{/}{\\/}g;
say qq{qr/$pat/$flags};


2 commentaires

Je compile mes regexs sans drapeaux, la version simple Eric Erics est suffisante pour moi. Quoi qu'il en soit, merci beaucoup pour l'explication détaillée !!!


@ JM666, encore une fois, si vous le savez, pourquoi avez-vous besoin d'extraire le modèle d'origine d'un re?