2012-03-13 12 views
7

Tengo un problema extraño al hacer coincidir un patrón.Coincidencia de patrones Perl al utilizar matrices

Considere el código Perl debajo

#!/usr/bin/perl -w 

use strict; 
my @Array = ("Hello|World","Good|Day"); 

function(); 
function(); 
function(); 

sub function 
{ 
    foreach my $pattern (@Array) 
    { 
    $pattern =~ /(\w+)\|(\w+)/g; 
    print $1."\n"; 
    } 
    print "\n"; 
} 

__END__ 

La salida espero que debería ser


 
Hello 
Good 

Hello 
Good 

Hello 
Good 

Pero lo que consigo es

 
Hello 
Good 

Use of uninitialized value $1 in concatenation (.) or string at D:\perlfiles\problem.pl li 
ne 28. 
Use of uninitialized value $1 in concatenation (.) or string at D:\perlfiles\problem.pl li 
ne 28. 

Hello 
Good 

Lo que observé fue que el patrón coincide alternativamente.
¿Alguien me puede explicar cuál es el problema con respecto a este código?
Para solucionar este cambié la subrutina función a algo como esto:

sub function 
{ 
    my $string; 
    foreach my $pattern (@Array) 
    { 
     $string .= $pattern."\n"; 
    } 
    while ($string =~ m/(\w+)\|(\w+)/g) 
    { 
      print $1."\n"; 
    } 
    print "\n"; 
} 

ahora consigo la salida como se esperaba.

Respuesta

6

Es el modificador global /g que está en funcionamiento. Recuerda la posición de la última coincidencia de patrón. Cuando llega al final de la cadena, comienza de nuevo.

Elimina el modificador /g y actuará como lo esperas.

+0

Eliminé/g modificador. Funcionó como se esperaba. – vels

Cuestiones relacionadas