regex - solo - ¿Hay una función Perl para convertir una cadena en una expresión regular para usar esa cadena como patrón?
javascript regex test (5)
Tengo problemas para usar Perl grep () con una cadena que puede contener caracteres que se interpretan como cuantificadores de expresiones regulares.
Obtuve el siguiente error cuando el patrón grep es "g ++" porque los símbolos ''+'' se interpretan como cuantificadores. Aquí está la salida de para el programa que sigue:
1..3
ok 1 - grep, pattern not found
ok 2 - grep, pattern found
Nested quantifiers in regex; marked by <-- HERE
in m/g++ <-- HERE / at escape_regexp_quantifier.pl line 8.
¿Hay algún modificador que pueda utilizar para indicar que los cuantificadores deben ignorarse, o hay una función que escaparía de los cuantificadores?
#! /usr/bin/perl
sub test_grep($)
{
my $filter = shift;
my @output = ("-r-xr-xr-x 3 root bin 122260 Jan 23 2005 gcc",
"-r-xr-xr-x 4 root bin 124844 Jan 23 2005 g++");
return grep (!/$filter/, @output);
}
use Test::Simple tests => 2;
ok(test_grep("foo"), "grep, pattern not found");
ok(test_grep("gcc"), "grep, pattern found");
ok(test_grep("g++"), "grep, pattern found");
PD: además de la pregunta de respuesta de arriba, recibo cualquier comentario sobre el uso de Perl en lo anterior, ya que todavía estoy aprendiendo. Gracias
Creo que estás buscando quotemeta
Además de la pregunta de respuesta anterior, agradezco cualquier comentario sobre el uso de Perl en los párrafos anteriores, ya que todavía estoy aprendiendo. Gracias
Te aconsejaría que no uses prototipos (el ($) después de test_grep). Tienen sus usos, pero no para la mayoría de los casos y definitivamente no en este.
En cualquier caso, sugiero utilizar qr para crear objetos Regexp en lugar de cadenas.
ok(test_grep(qr/foo/), "grep, pattern not found");
ok(test_grep(qr/gcc/), "grep, pattern found");
ok(test_grep(qr/g/+/+/), "grep, pattern found");
Entonces no necesitas el escape / Q. Aunque todavía puedes usarlo:
ok(test_grep(qr//Qg++/), "grep, pattern found");
PD: además de la pregunta de respuesta de arriba, recibo cualquier comentario sobre el uso de Perl en lo anterior, ya que todavía estoy aprendiendo.
El mejor consejo que puedo dar para el consejo de codificación de Perl en general es instalar Perl :: Critic y usar el comando perlcritic en su código. Si no puede hacer eso, puede usar la herramienta crítica perl en línea . Le será útil si tiene a mano una copia de Perl Best Practices , ya que Perl::Critic
ya ha leído el libro y le dará referencias sobre los números de las páginas; sin embargo, incluso si no tiene el libro, todavía puede encontrar comentarios ampliados en las secciones de documentación de Perl :: Critic que comienzan con Perl::Critic::Policy::
.
La forma estándar es usar el indicador de escape /Q
antes de su variable, para decirle a Perl que no analice los contenidos como una expresión regular:
return grep (!//Q$filter/, @output);
Alterar esa línea en tu código produce:
1..3 ok 1 - grep, pattern not found ok 2 - grep, pattern found ok 3 - grep, pattern found