2009-11-02 7 views
11

Si tengo un operador de coincidencia, ¿cómo guardo las partes de las cadenas capturadas entre paréntesis en las variables en lugar de usar $1, $2, etc.?¿Cómo puedo extraer las coincidencias del operador de coincidencia de Perl en variables?

... = m/stuff (.*) stuff/; 

¿Qué va a la izquierda?

+0

He reemplazado completamente la pregunta en función de los comentarios de joachim a otras respuestas. No es una pregunta regex. –

+0

Con la frase de pregunta así, tiene sentido que parece haber votado negativamente mi respuesta. – innaM

+0

@brian, su edición es probablemente más concisa, ya que mi pregunta era puramente acerca de la sintaxis para usar con y alrededor del operador m // en lugar de usar la propia expresión regular. Mi error. Pero me gustaría poner la palabra 'extraer' de nuevo en algún lado, ya que es lo que buscaré cuando olvide cómo hacerlo. – joachim

Respuesta

29

El truco es hacer el trabajo m // en el contexto de lista mediante el uso de una asignación de lista:

($interesting) = $string =~ m/(interesting)/g; 

Esto puede ser perfectamente extendida para agarrar más cosas, por ejemplo:

($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g; 
+0

Es cierto. Aunque el bit en el que siempre me quedo atascado es la sintaxis para obtener cosas en variables con nombre, en lugar del lado de expresiones regulares, así que escatimé en la parte de expresiones regulares del ejemplo y respondí. – joachim

+0

[También] (https://perlmaven.com/how-to-extract-strings-from-a-file) '@interesting = $ string ...'? –

3

Por lo general, También quiero hacer una prueba para asegurarme de que la cadena de entrada coincida con su expresión regular. De esa manera también puede manejar casos de error.

Para extraer algo interesante también debe tener alguna forma de anclar el bit que le interesa extraer.

Así que, con su ejemplo, este primero se asegurará de la cadena de entrada coincide con nuestra expresión, y luego extraer el bit entre los dos bits 'aburridas':

$input = "boring interesting boring"; 
if($input =~ m/boring (.*) boring/) { 
    print "The interesting bit is $1\n"; 
} 
else { 
    print "Input not correctly formatted\n"; 
} 
8

Utilice el horquillado construir (...) para crear una buffer de captura Luego use las variables especiales $1, $2, etc. para acceder a la cadena capturada.

if (m/(interesting)/) { 
    my $captured = $1; 
} 
+0

** No necesita un grupo de captura ** cuando quiere la expresión completa. ** Simplemente usa '$ 0' en su lugar.** –

+5

@Peter: creo que debe haber confundido $ 0, el nombre del programa actual, con algo más. –

+0

... con algo completamente diferente, de hecho. – innaM

0

$ & - La cadena coincidente por el último ajuste de patrones éxito (sin contar ninguna coincidencia ocultos dentro de un bloque o eval() encerrado por el bloque actual).

#! /usr/bin/perl 

use strict; 
use warnings; 

my $interesting; 
my $string = "boring interesting boring"; 
$interesting = $& if $string =~ /interesting/; 
+4

No use $ &. Especialmente en este caso, si está haciendo coincidir el texto literal, no tiene que coincidir en absoluto. Ya sabes la respuesta sin $ y. –

2

Puede usar búferes de captura con nombre:

if (/ (?<key> .+?) \s* : \s* (?<value> .+) /x) { 
    $hash{$+{key}} = $+{value}; 
} 
1

@strings va a la izquierda y contendrá resultado, entonces va su cadena de entrada $input_string. No olvide marcar g para hacer coincidir todas las subcadenas.

my @strings=$input_string=~m/stuff (.*) stuff/g; 
Cuestiones relacionadas