C'è un modo per precompilare una regex in Perl? Ne ho uno che uso molte volte in un programma e non cambia tra gli usi.C'è un modo per precompilare una regex in Perl?
risposta
Per letterale (statico) regex non c'è niente da fare - perl compilerà solamente una volta.
Per le regex memorizzate nelle variabili sono disponibili un paio di opzioni. È possibile utilizzare l'operatore qr//
di costruire un oggetto di espressione regolare:
my $re = qr/foo|bar/;
if ($var =~ $re) {
# ...
}
Questo è utile se si desidera utilizzare una regex in più luoghi o passarlo a subroutine.
Se l'espressione regolare è in una stringa è possibile utilizzare l'opzione /o
a promettere perl che non potrà mai cambiare:
my $pattern = 'foo|bar';
if ($var =~ /$pattern/o) {
# ...
}
Di solito è meglio non farlo, però. Perl è abbastanza intelligente da sapere che la variabile non è cambiata e che la regex non ha bisogno di essere ricompilata. Specificare /o
è probabilmente un micro-ottimizzazione prematuro. È anche una potenziale trappola. Se la variabile è stata modificata con utilizzando /o
, il perl utilizzerà comunque la regex precedente. Ciò potrebbe portare a una diagnosi difficile dei bachi.
Semplice: controllare l'operatore qr // (documentato in perlop in Regexp Quote-Like Operators).
my $regex = qr/foo\d/;
$string =~ $regex;
bello, sembra che possa essere usato come un modello nel costrutto s ///. È ancora pre-compilato o è compilato di nuovo in questo caso? – akostadinov
@akostadinov È ancora pre-compilato. –
- 1. In Perl, c'è un modo per legare una scorta?
- 2. C'è un modo per sovraccaricare l'operatore di regex binding `= ~` in Perl?
- 3. regex Javascript rispetto a regex Perl
- 4. Come eseguire perl regex in linea senza impostare una variabile?
- 5. Come si usa una variabile come modificatore regex in perl?
- 6. Perl regex virgolette singole
- 7. Escaping caratteri speciali in Perl regex
- 8. perl beffa c'è un modo per deridere $?
- 9. Perl Regex "Not" (lookahead negativo)
- 10. Modo per implementare una regex migliore in Node.js
- 11. Incorporamento di valutazioni in Perl regex
- 12. Qual è il modo migliore per ottenere una funzionalità simile a sscanf in Perl?
- 13. Perl RegEx errore di sintassi
- 14. fuga pipe ("|") in una regex
- 15. test per "EndsWith" in modo efficiente con un Regex
- 16. Perl regex sostituire nel medesimo caso
- 17. perl regex per l'estrazione di blocchi di più righe
- 18. Perl: "Quantifier in {,} maggiore di 32766 in regex"
- 19. Perl regex trova carattere da set arbitrario
- 20. E 'regex un buon modo per testare un url
- 21. Una semplice regex Perl garantita per non corrispondere mai a una stringa?
- 22. Regex per abbinare una lumaca?
- 23. Perl: analizzare la stringa esadecimale codificata in array con regex
- 24. Un modo semplice per precompilare i modelli di Handlebar Emberjs con nodejs?
- 25. Come l'introspezione regex nella API Perl
- 26. Regex: come rimuovere spazi aggiuntivi tra le stringhe in Perl
- 27. Precompilare XmlSerializers con XmlAttributeOverrides
- 28. Quale sapore POSIX di regex utilizza Perl?
- 29. modo più semplice per costruire una stringa interpolando i valori in un modello Regex?
- 30. Precompilare applicazioni GWAN
Questi sono veri; tuttavia, qr // è stato supportato per molti anni (esiste già dalle 5.005, e penso che non ci siano stati problemi dal 5.8) – ephemient
@ephemient Bene, 5.10 ha una perdita di memoria fastidiosa associata a qr // (e alla compilazione delle regex in generale), ma è stato risolto. Se si utilizza 5.10, è possibile verificare se si dispone della perdita di memoria dicendo perl -e 'qr // while 1'. So che la versione OS X di ActiveState Perl 5.10 è ancora danneggiata. –
Nota dal 2016: il modificatore '/ o' è stato deprecato. Vedi [questa domanda] (http://stackoverflow.com/q/550258/477563) per i dettagli. –