2009-06-04 26 views

Respuesta

57

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.

+3

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

+8

@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. –

+2

Nota de 2016: el modificador '/ o' ha quedado en desuso. Ver [esta pregunta] (http://stackoverflow.com/q/550258/477563) para más detalles. –

19

Simple: Compruebe el operador qr // (documentado en perlop en Regexp Quote-Like Operators).

my $regex = qr/foo\d/; 
$string =~ $regex; 
+0

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

+0

@akostadinov Todavía está precompilado. –

Cuestiones relacionadas