De respuesta perlfaq6 's a How do I match a regular expression that's in a variable?:
No tenemos los patrones de codificar directamente en el operador partido (o cualquier otra cosa que funciona con expresiones regulares). Podemos poner el patrón en una variable para su uso posterior.
El operador de coincidencia es un contexto de comillas dobles, por lo que puede interpolar su variable como una cadena entre comillas dobles. En este caso, lee la expresión regular como entrada de usuario y la almacena en $ regex. Una vez que tenga el patrón en $ regex, use esa variable en el operador de coincidencia.
chomp(my $regex = <STDIN>);
if($string =~ m/$regex/) { ... }
Los caracteres especiales de expresiones regulares en $ expresiones regulares son todavía especial, y el patrón aún tiene que ser válido o Perl se quejan. Por ejemplo, en este patrón hay un paréntesis sin par.
my $regex = "Unmatched (paren";
"Two parens to bind them all" =~ m/$regex/;
Cuando Perl compila la expresión regular, trata el paréntesis como el inicio de una coincidencia de memoria.Cuando no encuentra el paréntesis de cierre, se queja:
Unmatched (in regex; marked by <-- HERE in m/Unmatched (<-- HERE paren/ at script line 3.
Usted puede evitar esto de varias maneras dependiendo de nuestra situación. Primero, si no desea que ninguno de los caracteres de la cadena sea especial, puede escapar de ellos con quotemeta antes de usar la cadena.
chomp(my $regex = <STDIN>);
$regex = quotemeta($regex);
if($string =~ m/$regex/) { ... }
También puede hacerlo directamente en el operador de coincidencia utilizando las secuencias \ Q y \ E. La \ Q le dice a Perl dónde comenzar a escapar caracteres especiales, y la \ E le dice dónde detenerse (ver perlop para más detalles).
chomp(my $regex = <STDIN>);
if($string =~ m/\Q$regex\E/) { ... }
Alternativamente, puede utilizar QR //, el operador regular de cotización expresión (ver perlop para más detalles). Cita y tal vez compila el patrón y puede aplicar indicadores de expresión regulares al patrón.
chomp(my $input = <STDIN>);
my $regex = qr/$input/is;
$string =~ m/$regex/ # same as m/$input/is;
También puede atrapar cualquier error al envolver un bloque eval alrededor de todo.
chomp(my $input = <STDIN>);
eval {
if($string =~ m/\Q$input\E/) { ... }
};
warn [email protected] if [email protected];
O ...
my $regex = eval { qr/$input/is };
if(defined $regex) {
$string =~ m/$regex/;
}
else {
warn [email protected];
}
Ver http://stackoverflow.com/questions/1949731/how-can-i-escape-a-literal-string-i- want-to-interpolate-into-a-regular-expression –
posible duplicado de [¿Cómo manejo los caracteres especiales en un Perl regex?] (http://stackoverflow.com/questions/576435/how-do-i-handle -special-characters-in-a-perl-regex) – daxim