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 |
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
/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.