next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Algunas Extensiones Sup: Introducción Ant: Ambito Automático Err: Si hallas una errata ...

Subsecciones



Opciones

Modificador Significado
e evaluar: evaluar el lado derecho de una sustitución como una expresión
g global: Encontrar todas las ocurrencias
i ignorar: no distinguir entre mayúsculas y minúsculas
m multilínea (^ y $ casan con \n internos)
o optimizar: compilar una sola vez
s ^ y $ ignoran \n pero el punto . ``casa'' con \n
x extendida: permitir comentarios

El Modificador /g

La conducta de este modificador depende del contexto. En un contexto de listas devuelve una lista con todas las subcadenas casadas por todos los paréntesis en la expresión regular. Si no hubieran paréntesis devuelve una lista con todas las cadenas casadas (como si hubiera paréntesis alrededor del patrón global).

   1 #!/usr/bin/perl -w
   2 ($one, $five, $fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
   3 print "$one, $five, $fifteen\n";

Observe la salida:

> uptime
  1:35pm  up 19:22,  0 users,  load average: 0.01, 0.03, 0.00
> glist.pl
0.01, 0.03, 0.00

En un contexto escalar m//g itera sobre la cadena, devolviendo cierto cada vez que casa, y falso cuando deja de casar. En otras palabras, recuerda donde se quedo la última vez y se recomienza la búsqueda desde ese punto. Se puede averiguar la posicion del emparejamiento utilizando la función pos. Si por alguna razón modificas la cadena en cuestión, la posición de emparejamiento se reestablece al comienzo de la cadena.

   1 #!/usr/bin/perl -w
   2 # count sentences in a document
   3 #defined as ending in [.!?] perhaps with
   4 # quotes or parens on either side.
   5 $/ = ""; # paragraph mode
   6 while ($paragraph = <>) {
   7   print $paragraph;
   8   while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
   9     $sentences++;
  10   }
  11 }
  12 print "$sentences\n";

Observe el uso de la variable especial $/. Esta variable contiene el separador de registros en el fichero de entrada. Si se iguala a la cadena vacía usará las líneas en blanco como separadores. Se le puede dar el valor de una cadena multicarácter para usarla como delimitador. Nótese que establecerla a \n\n es diferente de asignarla a "". Si se deja undef, la siguiente lectura leerá todo el fichero.

Sigue un ejemplo de ejecución. El programa se llama gscalar.pl. Introducimos el texto desde STDIN. El programa escribe el número de párrafos:

> gscalar.pl
este primer parrafo. Sera seguido de un
segundo parrafo.
 
"Cita de Seneca".
 
3

La opción e: Evaluación del remplazo

La opción /e permite la evaluación como expresión perl de la cadena de reemplazo (En vez de considerarla como una cadena delimitada por doble comilla).

   1 #!/usr/bin/perl -w
   2 $_ = "abc123xyz\n";
   3 s/\d+/$&*2/e;
   4 print;
   5 s/\d+/sprintf("%5d",$&)/e;
   6 print;
   7 s/\w/$& x 2/eg;
   8 print;
El resultado de la ejecución es:
> replacement.pl
abc246xyz
abc  246xyz
aabbcc  224466xxyyzz

Véase un ejemplo con anidamiento de /e:

   1 #!/usr/bin/perl 
   2 $a ="one";
   3 $b = "two";
   4 $_ = '$a $b';
   5 print "_ = $_\n\n";
   6 s/(\$\w+)/$1/ge;
   7 print "After 's/(\$\w+)/$1/ge' _ = $_\n\n";
   8 s/(\$\w+)/$1/gee;
   9 print "After 's/(\$\w+)/$1/gee' _ = $_\n\n";
El resultado de la ejecución es:
 
> enested.pl
_ = $a $b
 
After 's/($w+)/$b/ge' _ = $a $b
 
After 's/($w+)/$b/gee' _ = one two

He aqui una solución que hace uso de e al siguiente ejercicio (véase 'Regex to add space after punctuation sign' en PerlMonks) Se quiere poner un espacio en blanco después de la aparición de cada coma:

s/,/, /g;
pero se quiere que la sustitución no tenga lugar si la coma esta incrustada entre dos dígitos. Además se pide que si hay ya un espacio después de la coma, no se duplique

s/(\d[,.]\d)|(,(?!\s))/$1 || "$2 "/ge;

Se hace uso de un lookahead negativo (?!\s). Véase la sección 3.2.3 para entender como funciona un lookahead negativo.


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Algunas Extensiones Sup: Introducción Ant: Ambito Automático Err: Si hallas una errata ...
Casiano Rodríguez León
2013-03-05