Uso de Perl desde la Línea de Comandos: Modificación en Múltiples Ficheros

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:

-e
puede usarse para definir el script en la línea de comandos. Multiples -e te permiten escribir un multi-script. Cuando se usa -e, perl no busca por un fichero de script entre la lista de argumentos.

-p
La opción -p hace que perl incluya un bucle alrededor de tu ``script'' al estilo sed:
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.

-n
Nótese que las líneas se imprimen automáticamente. Para suprimir la impresión usa la opción -n

-i[ext]
La opción -i Expresa que los ficheros procesados serán modificados. Se renombra el fichero de entrada 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/;

Ejercicio 2.3.1   Lea perldoc perlrun

Ejercicio 2.3.2   Salida con Formato:

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;

Ejercicio 2.3.3   Contextos y E/S:

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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19