¿Hay alguna manera de precompilar una expresión regular en Perl? Tengo uno que utilizo muchas veces en un programa y no cambia entre usos.¿Hay alguna manera de precompilar una expresión regular en Perl?
Respuesta
Para las expresiones regulares (estáticas) no hay nada que hacer - perl solo las compilará una vez.
if ($var =~ /foo|bar/) {
# ...
}
Para las expresiones regulares almacenadas en variables tiene un par de opciones. Usted puede utilizar el operador qr//
para construir un objeto de expresiones regulares:
my $re = qr/foo|bar/;
if ($var =~ $re) {
# ...
}
Esto es útil si desea utilizar una expresión regular en múltiples lugares o pasarlo a subrutinas.
Si el patrón de expresión está en una cadena que puede utilizar la opción /o
prometer Perl que nunca va a cambiar:
my $pattern = 'foo|bar';
if ($var =~ /$pattern/o) {
# ...
}
Por lo general es mejor no hacer eso, sin embargo. Perl es lo suficientemente inteligente como para saber que la variable no ha cambiado y que no es necesario volver a compilar la expresión regular. Especificar /o
es probablemente una micro-optimización prematura. También es una trampa potencial. Si la variable tiene cambiado usando /o
haría que perl use la antigua expresión regular de todos modos. Eso podría llevar a errores difíciles de diagnosticar.
Simple: Compruebe el operador qr // (documentado en perlop en Regexp Quote-Like Operators).
my $regex = qr/foo\d/;
$string =~ $regex;
bueno, parece que se puede usar como un patrón en el constructo s ///. ¿Todavía está precompilado o se compila nuevamente en este caso? – akostadinov
@akostadinov Todavía está precompilado. –
- 1. ¿Hay una expresión regular para detectar una expresión regular válida?
- 2. Expresión regular - Ruby vs Perl
- 3. Perl dividida y expresión regular
- 4. Perl: Coincidencia de claves hash con una expresión regular
- 5. ¿Hay alguna manera de usar ConcurrentDictionary.TryUpdate con una expresión lambda?
- 6. ¿Hay alguna manera de especificar una expresión lambda C# "vacía"?
- 7. ¿Hay alguna forma de realizar una sustitución dinámica en una expresión regular?
- 8. ¿Hay alguna forma más corta de extraer grupos de una expresión regular Powershell?
- 9. ¿Hay una expresión regular para eliminar una barra final en Perl?
- 10. ¿Expresión regular para encontrar una expresión regular?
- 11. ¿Hay alguna forma de evaluar el número de veces que una expresión regular de Perl ha coincidido?
- 12. ¿Hay una expresión regular en Perl para encontrar la extensión de un archivo?
- 13. Coincidencia de una expresión regular varias veces con Perl
- 14. ¿Alguna forma de mejorar esta expresión regular?
- 15. ¿Cómo se comenta una expresión regular de Perl?
- 16. expresión regular "contiene" otra expresión regular
- 17. ¿Cómo descompilar una expresión regular?
- 18. ¿Hay una expresión regular compatible con Perl para recortar el espacio en blanco de ambos lados de una cadena?
- 19. expresión regular para definir alguna secuencia binaria
- 20. Perl expresión regular cómo escapar sólo algunos caracteres
- 21. ¿Por qué no hay un estándar de expresión regular?
- 22. Comprueba si una expresión regular cubre otra expresión regular
- 23. R- cuestión expresión regular
- 24. Perl: ¿Es buena o mala expresión regular y cómo mejorarla?
- 25. ¿hay alguna forma de obtener todos los resultados posibles de un patrón de expresión regular?
- 26. Interpolando una cadena en una expresión regular
- 27. Coincidencia con una expresión regular en Scala
- 28. ¿Hay alguna manera de desactivar una etiqueta?
- 29. expresión regular en iOS
- 30. ¿Hay alguna manera de pausar una CABasicAnimation?
Estos son verdaderos; sin embargo, qr // ha sido soportado por muchos años (existe desde 5.005, y creo que no ha habido problemas desde 5.8) – ephemient
@ephemient Bueno, 5.10 tiene una desagradable pérdida de memoria asociada con qr // (y compila expresiones regulares) en general), pero eso ha sido arreglado. Si está utilizando 5.10, puede verificar si tiene la pérdida de memoria diciendo perl -e 'qr // while 1'. Sé que la versión OS X de ActiveState Perl 5.10 aún está rota. –
Nota de 2016: el modificador '/ o' ha quedado en desuso. Ver [esta pregunta] (http://stackoverflow.com/q/550258/477563) para más detalles. –