2011-09-28 20 views
31

Digamos que estoy escaneando una página de HTML sin procesar en busca de esta expresión regular. (La comilla en el extremo es intencional).Perl iterar a través de cada coincidencia

m/(https?:\/\/.*?(?:'|"))/ 

Este patrón es probable que coincida ~ 100 veces. ¿Qué es un idioma perl común/una forma rápida de iterar a través de una lista de todas las coincidencias del grupo de captura?

Respuesta

49

Desde el perlretut (un muy buen tutorial)

while ($x =~ /(\w+)/g) { 
     print "Word is $1, ends at position ", pos $x, "\n"; 
    } 

Puede utilizar while junto con el modificador g para iterar sobre todos los partidos, con $1 se obtiene el contenido de su grupo de captura 1, y en este ejemplo del tutorial también obtiene el puesto con pos.

+1

Gracias STEMA para recommanding perlretut: es una página impresionante para expresiones regulares en Perl; cubre todo, desde principiante hasta avanzado. –

+0

No olvides agregar el modificador 'm' si trabajas con cadenas de varias líneas y anclas ^, $ –

6

El juego global 'g' modificador devuelve una lista de coincidencias capturados en el contexto de lista:

say $_ for $str =~ /un($wanted)/g; # Prints only $wanted 
0

@Zahid: Creo que su enfoque es más compacto. espero que el siguiente fragmento ayudará a entender su ejemplo

my $str = 'file_%date%_%name%_%lang%.txt'; 
my @ts = $str =~ /%([\w]+)%/g;#   <----------Zahid said 
print join(", ", @ts); 

Salida:

date, name, lang 
Cuestiones relacionadas