sustituir regulares operadores fichero expresiones ejemplos crear cortar con cadena buscar basicos regex perl arrays

regex - operadores - ¿Cómo puedo almacenar las capturas de expresiones regulares en una matriz en Perl?



perl buscar cadena fichero (4)

Estoy tratando de usar expresiones regulares en Perl. Lo que me preguntaba era si es posible almacenar todas las coincidencias de la expresión en una matriz? Sé que puedo usar lo siguiente: ($1,...,$n) = m/expr/g; pero parece que solo se puede usar si sabes el número de coincidencias que estás buscando. He intentado my @array = m/expr/g; pero eso no parece funcionar.

¡Gracias por tu ayuda!


A veces necesitas obtener todas las coincidencias de forma global, como lo hace el preg_match_all de PHP. Si es tu caso, entonces puedes escribir algo como:

# a dummy example my $subject = ''Philip Fry Bender Rodriguez Turanga Leela''; my @matches; push @matches, [$1, $2] while $subject =~ /(/w+) (/w+)/g; use Data::Dumper; print Dumper(/@matches);

Imprime

$VAR1 = [ [ ''Philip'', ''Fry'' ], [ ''Bender'', ''Rodriguez'' ], [ ''Turanga'', ''Leela'' ] ];


Consulte la entrada manual para perldoc perlop en "Coincidencia en el contexto de la lista":

Si no se usa la opción / g, m // en el contexto de la lista devuelve una lista que consiste en las subexpresiones que coinciden con los paréntesis en el patrón, es decir, ($ 1, $ 2, $ 3 ...)

El modificador / g especifica la coincidencia de patrones globales, es decir, la coincidencia tantas veces como sea posible dentro de la cadena. Cómo se comporta depende del contexto. En el contexto de la lista, devuelve una lista de las subcadenas que coinciden con cualquier paréntesis de captura en la expresión regular. Si no hay paréntesis, devuelve una lista de todas las cadenas coincidentes, como si hubiera paréntesis alrededor de todo el patrón.

Simplemente puede obtener todas las coincidencias asignándolas a una matriz o realizando la evaluación en contexto de lista:

my @matches = ($string =~ m/word/g);


Creo que este es un ejemplo que se explica por sí mismo. Nota /g modificador en la primera expresión regular:

$string = "one two three four"; @res = $string =~ m/(/w+)/g; print Dumper(@res); # @res = ("one", "two", "three", "four") @res = $string =~ m/(/w+) (/w+)/; print Dumper(@res); # @res = ("one", "two")

Recuerde, debe asegurarse de que lvalue se encuentre en el contexto de la lista, lo que significa que debe rodear los valores escalares con paréntesis:

($one, $two) = $string =~ m/(/w+) (/w+)/;


Si está haciendo una coincidencia global ( /g ), la expresión regular en el contexto de la lista devolverá todas las coincidencias capturadas. Simplemente hazlo:

my @matches = ( $str =~ /pa(tt)ern/g )

Este comando, por ejemplo:

perl -le ''@m = ( "foo12gfd2bgbg654" =~ /(/d+)/g ); print for @m''

Da la salida:

12 2 654