Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > perl > Perl en sólo una línea

Perl en sólo una línea

Perl es utilizado en muchas tareas de administración de sistemas porque, entre otras ventajas, dispone de un nutrido grupo de parámetros de llamada del propio intérprete que hacen que éste haga cosas.

Dos fuentes de referencia para abrir boca:

Y ahora vamos con esas cosas que se supone que el intérprete Perl hace automágicamente.

Ejecutar expresiones Perl: -e

Este parámetro, que puede repetirse varias veces, permite ejecutar expresiones Perl directamente. No se buscarán nombres de programa en los restantes argumentos y se añade un salto de línea al final de cada expresión.

$ perl -e 'print "Hello\n"' -e 'print "and goodbye\n"

Procesar fin de línea automáticamente: -l

Habilita el proceso de final de líneas leídas, con las siguientes acciones:

  1. Aplica chomp() en todas las líneas cuando se usan los parámetros -n y/ó p
  2. #FIXME#

Lectura y proceso de la entrada: -n

Envuelve todas las expresiones de código alrededor de lo siguiente:

    1 LINE:
    2 while (<>) {
    3     ...         # aqui va nuestro codigo
    4 }

Es decir, lee la entrada estándar, línea a línea, y ejecuta el código indicado dentro del bucle.

Lectura y proceso de la entrada con copia a la salida estándar: -p

Envuelve todas las expresiones de código alrededor de lo siguiente:

    1 LINE:
    2 while (<>) {
    3     ...         # aqui va nuestro codigo
    4 } continue {
    5     print;
    6 }

Lo que provoca que, tras ejecutar nuestro código, en cada pasada del bucle, envía a la salida estándar del proceso el contenido de la variable $_.

Partir la entrada en campos: -a

Utilizado con -p ó -n habilita un preproceso de cada línea de entrada, efectuando una división por espacios mediante la función split sobre el array @F. El separador puede cambiarse utilizando el parámetro -F.

    1 LINE:
    2 while (<>) {
    3     @F = split(' ');
    4     ...                 # aqui va nuestro codigo

Modificando archivos in situ: -i

Este parámetro habilita un modo especial en el que la construcción <> opera sobre los archivos in situ, modificándo su contenido, y con la posibilidad de efectuar una copia de seguridad sobre los mismos.

Es equivalente a la siguiente construcción:

    1 #!/usr/bin/perl
    2 $extension = '.orig';
    3 LINE: while (<>) {
    4     if ($ARGV ne $oldargv) {
    5         if ($extension !~ /\*/) {
    6             $backup = $ARGV . $extension;
    7         }
    8         else {
    9             ($backup = $extension) =~ s/\*/$ARGV/g;
   10         }
   11         rename($ARGV, $backup);
   12         open(ARGVOUT, ">$ARGV");
   13         select(ARGVOUT);
   14         $oldargv = $ARGV;
   15     }
   16 
   17     ....        # aqui va nuestro codigo
   18 
   19 }
   20 continue {
   21     print; # this prints to original filename
   22 }
   23 
   24 select(STDOUT);

Para lograr esto, Perl realiza las siguientes tareas:

  1. Renombra el archivo original para conservar una copia de seguridad siempre que se proporcione una extensión a este parámetro:
    1. Si la extensión no contiene un asterisco (*) se añade al final del nombre del archivo como un sufijo.
    2. Si contiene uno ó más caracteres asterisco se sustituyen por el nombre del archivo original, de manera que es posible crear prefijos, sufijos ó incluso moverlos a otros directorios (siempre que éstos existan de antemano).
  2. Abre el archivo de salida hacia el nombre original.
  3. Selecciona dicho archivo como el destino predeterminado del operador print.

Es posible comprobar el final de cada fichero utilizando el operador eof.