Aunque no es la forma de uso habitual, Perl puede ser utilizado en ``modo sed'' para modificar el texto en múltiples ficheros:
perl -e 's/nereida\.deioc\.ull\.es/miranda.deioc.ull.es/gi' -p -i.bak *.html
Este programa sustituye la palabra original (g)lobalmente e i)gnorando el ``case'') en todos los ficheros *.html
y para cada uno de ellos crea una copia de seguridad *.html.bak
.
Otro ejemplo: la sustitución que sigue ocurre en todos los ficheros info.txt
en todos
los subdirectorios de los subdirectorios que comiencen por alu
:
perl -e 's/\|hyperpage//gi' -p -i.bak alu*/*/info.txt
Las opciones de línea de comandos significan lo siguiente:
while (<>) { ... # your script goes here } continue { print; }El siguiente fragmento de la documentación e
perlrun
detalla la semántica de -p
y -i
:
From the shell, saying $ perl -p -i.orig -e "s/foo/bar/; ... " is the same as using the program: #!/usr/bin/perl -pi.orig s/foo/bar/; which is equivalent to #!/usr/bin/perl $extension = '.orig'; LINE: while (<>) { if ($ARGV ne $oldargv) { if ($extension !~ /\*/) { $backup = $ARGV . $extension; } else { ($backup = $extension) =~ s/\*/$ARGV/g; } rename($ARGV, $backup); open(ARGVOUT, ">$ARGV"); select(ARGVOUT); $oldargv = $ARGV; } s/foo/bar/; } continue { print; # this prints to original filename } select(STDOUT); except that the -i form doesn’t need to compare $ARGV to $oldargv to know when the filename has changed. It does, however, use ARGVOUT for the selected filehandle. Note that STDOUT is restored as the default output filehandle after the loop.
file.in
a file.in.ext
, abriendo el de salida con
el mismo nombre del fichero de entrada file.in
.
Se selecciona dicho fichero como de salida por defecto para las
sentencias print
. Si se proporciona una extensión se hace
una copia de seguridad. Si no, no se hace copia de seguridad.
En general las opciones pueden ponerse en la primera línea del ``script'', donde se indica el intérprete. Asi pues, decir
perl -p -i.bak -e "s/foo/bar/;"
es equivalente a usar el ``script'':
#!/usr/bin/perl -pi.bak s/foo/bar/;
perldoc perlrun
Indique como saldrá formateada la salida del siguiente código:
my @items = qw(un dos tres); my $format = "Los items son:\n".("%10s\n"x @items); printf $format, @items;
El operador <>
nos permite leer desde el flujo de entrada estandar. Así
$x = <>;lee una línea y almacena su contenido (incluyendo el retorno de carro final) en
$x
. Este operador es también sensible al contexto. Así, en un contexto de lista
@x = <>;Se lee todo el fichero (en entrada estadar unix, se leerán todas las líneas hasta que se pulse CTRL-D) y las diferentes líneas constituyen los elementos del array x.
¿En que contexto interpreta Perl el siguiente fragmento de código?
print sort <>;
Casiano Rodríguez León