2011-06-16 12 views
10

pregunta de Noob aquí. Tengo una muy simple script en Perl y quiero que la expresión regular para que coincida con múltiples partes en la cadena deCoincidencia de una expresión regular varias veces con Perl

my $string = "ohai there. ohai"; 
my @results = $string =~ /(\w\w\w\w)/; 
foreach my $x (@results){ 
    print "$x\n"; 
} 

Esto no está funcionando de la forma que yo quiero, ya que sólo devuelve ohai. Me gustaría que coincida e imprima ohai ther ohai

¿Cómo voy a hacer esto.

Gracias

Respuesta

28

¿Haría esto lo que usted desea?

my $string = "ohai there. ohai"; 
while ($string =~ m/(\w\w\w\w)/g) { 
    print "$1\n"; 
} 

Devuelve

ohai 
ther 
ohai 

De perlretut:

El modificador "// g" es sinónimo de juego global y permite al operador a juego para que coincida dentro de una cadena ya que muchos veces como sea posible.

Además, si usted quiere poner los partidos en una matriz en lugar que puede hacer:

my $string = "ohai there. ohai"; 
my @matches = ($string =~ m/(\w\w\w\w)/g); 
foreach my $x (@matches) { 
    print "$x\n"; 
}  
+2

+1. respuesta correcta. Necesitas el modificador 'g' al final de tu expresión regular. – Spudley

+2

gracias! Supongo que necesitaba mirar más de cerca los documentos para ese/g –

+0

. Es útil tener en cuenta que en "foreach", un "print $ 1" solo imprimirá el último "Ohai" cada vez que haya una coincidencia de patrón (es decir, 3 veces). Por lo tanto, "mientras" parece ser la mejor opción cuando tienes un patrón con varios elementos. –

0

O usted podría hacer esto

my $string = "ohai there. ohai"; 
my @matches = split(/\s/, $string); 
foreach my $x (@matches) { 
    print "$x\n"; 
} 

La función de división en este caso se divide en espacios e impresiones

ohai 
there. 
ohai 
+0

Una buena sugerencia, pero dividir aquí volvería "allí". con un punto Sería mejor hacer una "división (/ \ W + /, $ cadena)" para obtener solo las palabras. –

Cuestiones relacionadas