Herramientas de usuario

Herramientas del sitio


perl

Programación en Perl

Este capítulo está muy bien explicado en este tutorial de perl. Sobre este tutorial estarán basadas las clases de cátedra de Perl.

Si el enlace no está vivo, ésta es una copia local:

Algunos puntos importantes:

  • Para obtener la documentación de perl ingrese este comando desde el shell de Unix: % perldoc perl. Ahí aparece la lista de opciones y la lista de temas de los que se puede obtener ayuda con perldoc.
  • Para obtener la documentación de la función una función específica, como por ejemplo chop use: % perldoc -f chop.

Como complemento también puede consultar los apuntes de Patricio Poblete sobre perl.

También puede encontrar un breve introduccióna de perl al final del documento aplicaciones de un solo uso. Este documento describes varias herramientas de Unix para resolver rápidamente problemas sin recurrir a lenguajes de programación avanzados como C o Java.

Un ejemplo trivial

cat.pl:

  while (<>) {
    print
  }

Uso:

  % cat dias.txt
  lunes
  martes
  miercoles
  % perl cat.pl dias.txt
  lunes
  martes
  miercoles
  % cat dias.txt | perl cat.pl
  lunes
  martes
  miercoles
  %

Note que <> corresponde a un archivo pasado como primer argumento o la entrada estándar si no habían argumentos.

enum.pl:

  my $i= 1;

  while (<>) {
    print "$i: $_";
    $i++;
  }

Uso:

  % perl enum.pl dias.txt
  1: lunes
  2: martes
  3: miercoles
  %

Ejemplos de José Piquer

Aquí veremos ejemplos simples de código perl con aplicaciones 'clásicas'.

Primero tomemos un procesador de log de transferencias parecido al del apunte. La bitácora contiene líneas que dicen en alguna parte “host=servername”, por ejemplo:

## ignorar esta linea
1,2 host=ftp.dcc.uchile.cl 4
1,2 host=ftp 3,5,61,2,3,4,5,6
1,2 host=dcc.uchile.cl 2,5,61,2,3,4,5,6
1,2 host=dcc.uchile.cl 3,5,61,2,3,4,5,6
1,2 host=ftp 4,5,61,2,3,4,5,6
1,2 host=kk 4,5,61,2,3,4,5,6
1,2 host=dcc 4,5,61,2,3,4,5,6
1,2 host=dcc.uchile.cl 3,l,61,2,3,4,5,6
1,2 host=ftp 4
1,2 host=ftp.dcc.uchile.cl 4,5,61,2,3,4,5,6
1,2 host=dcc. 3,5,61,2,3,4,5,6

y queremos hacer un análisis sobre los distintos nombres de computador que aparecen en el log.

#!/usr/bin/perl

# uso de arreglos asociativos
while(<>)
{
    if( /.*host=([^ ]+) .*/ ) {
        $freq_tab{$1} = $freq_tab{$1} + 1;
    }
}

# lo recorro sin ningun orden
foreach $key (keys %freq_tab) {
   print "$freq_tab{$key}	$key\n";
}

Ahora queremos mostrar los resultados ordenados de más frecuente a menos frecuente, para lo que usamos el comando sort y un pipe hacia él:

 #!/usr/bin/perl

# uso de arreglos asociativos
while(<>)
{
    if( /.*host=([^ ]+).*/ ) {
        $freq_tab{$1} = $freq_tab{$1} + 1;
    }
}

open(OUT, "| sort -rn");
# select redirige la salida estandar
select(OUT);
foreach $key (keys %freq_tab) {
   print "$freq_tab{$key}	$key\n";
}
close(OUT);

Otro ejemplo es listar todos los archivos que comiencen con 'a':

#!/usr/bin/perl

# lista todos los archivos del directorio actual que empiezan con 'a'

system("ls a*");

Usamos el comando ls y el shell para expandir los nombres.

Esto también se puede hacer internamente en perl, tomando la salida de ls como una lista:

#!/usr/bin/perl

# lista todos los archivos del directorio actual que empiezan con 'a'

foreach $name (`ls`) {
    print "$name" if($name =~ /^a/); # en perl el cuerpo del if (si es una sola insruccion) puede ir a la izq
}

Pero en perl siempre existen muchas formas de hacer lo mismo. Primero, eliminando variables innecesarias: en perl la mayoría de las funciones se aplican sobre una variable default: $_ que, si no se escribe, funciona igual:

#!/usr/bin/perl

# lista todos los archivos del directorio actual que empiezan con 'a'

foreach (`ls`) {
    print if(/^a/);
}

Si no quiero usar el shell y manejar los nombres internamente, tengo funciones más parecidas a C:

#!/usr/bin/perl

opendir(FILES,".");
@files=readdir(FILES);
closedir(FILES);

print join("\n", grep {/^a/} @files); # grep retorna una sublista de la lista que calza con el patrón

print "\n";
perl.txt · Última modificación: 2012/11/27 12:09 por lmateu