2011-08-06 18 views
8

Por lo que yo sé en Perl '/ g' indicador global significa que la búsqueda reemplazará/devolver todos los partidos a lo largo de la cadena. Pero no soy capaz de entender la forma en que reacciona a las variables globales mientras que empareja, puede explicar alguien el por qué hay diferencia entre la producción de estos dos programas de ejemplo:ayuda para entender indicador global en Perl

Versión 1:

my $text = 'This is sample float value 3.2 '; 

getFloat(); 
getFloat(); 

sub getFloat(){ 
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/is){ 
     print "matched> $1$2$3 "; 
    } 
} 

salida: igualada> 3.2 emparejados> 3,2

Versión 2: (con indicador global)

my $text = 'This is sample float value 3.2 '; 

getFloat(); 
getFloat(); 

sub getFloat(){ 
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/gis){ 
     print "matched> $1$2$3 "; 
    } 
} 

Salida: emparejado> 3,2

Como se ve en las salidas, la coincidencia indicador global se produce sólo una vez. ¿Alguien puede explicar este comportamiento?

+0

Debería echarle un vistazo a [perldoc perlretut] (http://perldoc.perl.org/perlretut.html#Using-regular-expressions- en-Perl) – TLP

+0

¿Qué estás esperando? ¿Quieres que siga apareciendo hasta que no coincida? ¿No significaría eso que la condición 'si' siempre sería falsa? En resumen, 'if (/.../g)' no tiene sentido. – ikegami

Respuesta

10

Con el modificador g, la cadena recuerda el lugar de su última coincidencia, por lo que puede solicitar una coincidencia con un g en un ciclo while y encontrar todas las coincidencias.

Sin la g de empezar de nuevo cada vez y siempre encontrar el primer partido.

En su caso, con el g, coincidió con 3.2 la primera vez, pero la segunda vez que intentó hacer coincidir, no hubo más coincidencias.

Sin el g puede llamar al getFloat() un trillón de veces y siempre encontrará la primera coincidencia.

+0

Gracias por la respuesta puntual Ray –

8

Cuando se utiliza en un contexto lista /g, provoca =~ para devolver todos los partidos. Cuando se utiliza en un contexto escalar, /g causa =~ para devolver un partido cada vez que se utiliza, y luego falla (devuelve undef) cuando no hay más partidos, antes de comenzar de nuevo al comienzo de la cadena. (Puede evitar esto usando /gc). También puede usar la función pos($text) para encontrar o establecer la posición en la que desea iniciar la coincidencia.

Sin /g, =~ devuelve siempre el mismo partido cada vez. Esto es equivalente a configurar pos($text) a undef cada vez. (En un contexto de lista, =~ devuelve una lista de las capturas en su lugar.)

Cuestiones relacionadas