Herramientas de usuario

Herramientas del sitio


perl

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
perl [2012/11/13 02:04] – creado lmateuperl [2012/11/27 16:09] (actual) – [Programación en Perl] lmateu
Línea 4: Línea 4:
 [[http://flanagan.ugr.es/perl/index2.htm|tutorial de perl]].  Sobre este tutorial estarán [[http://flanagan.ugr.es/perl/index2.htm|tutorial de perl]].  Sobre este tutorial estarán
 basadas las clases de cátedra de Perl. basadas las clases de cátedra de Perl.
 +
 +Si el enlace no está vivo, ésta es una copia local:
 +
 +  * [[http://users.dcc.uchile.cl/~lmateu/CC3301/perl/intro.htm|Introducción]]
 +  * [[http://users.dcc.uchile.cl/~lmateu/CC3301/perl/datos.htm|Tipos de datos]]
 +  * [[http://users.dcc.uchile.cl/~lmateu/CC3301/perl/control.htm|Control de flujo]]
 +  * [[http://users.dcc.uchile.cl/~lmateu/CC3301/perl/masperl.htm|Perl un poco más a fondo]]
 +  * [[http://users.dcc.uchile.cl/~lmateu/CC3301/perl/objetos.htm|Objetos en Perl]] (opcional, no entra en el examen)
 +  * [[http://users.dcc.uchile.cl/~lmateu/CC3301/perl/enlaces.htm|enlaces]]
  
 Algunos puntos importantes: Algunos puntos importantes:
Línea 10: Línea 19:
   * Para obtener la documentación de la función una función específica, como por ejemplo chop use: ''% perldoc -f chop''.   * 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 [[http://users.dcc.uchile.cl/~lmateu/CC3301/apuntes/Perl/|perl]] o los ejemplos incluidos en los apuntes de José Piquer la +Como complemento también puede consultar los apuntes de Patricio Poblete sobre [[http://users.dcc.uchile.cl/~lmateu/CC3301/apuntes/Perl/|perl]]
-[[https://wiki.dcc.uchile.cl/cc3301/start#clase_23sh_awk_perl|sección de perl]].+ 
 +También puede encontrar un breve introduccióna de perl al final del documento 
 +[[http://www.dcc.uchile.cl/jpiquer/Docencia/cc31a/perl.pdf|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: 
 + 
 +<code> 
 +  while (<>) { 
 +    print 
 +  } 
 +</code> 
 + 
 +Uso: 
 + 
 +<code> 
 +  % cat dias.txt 
 +  lunes 
 +  martes 
 +  miercoles 
 +  % perl cat.pl dias.txt 
 +  lunes 
 +  martes 
 +  miercoles 
 +  % cat dias.txt | perl cat.pl 
 +  lunes 
 +  martes 
 +  miercoles 
 +  % 
 +</code> 
 + 
 +Note que <> corresponde a un archivo pasado como primer argumento o la entrada estándar 
 +si no habían argumentos. 
 + 
 +enum.pl: 
 + 
 +<code> 
 +  my $i= 1; 
 + 
 +  while (<>) { 
 +    print "$i: $_"; 
 +    $i++; 
 +  } 
 +</code> 
 + 
 +Uso: 
 + 
 +<code> 
 +  % perl enum.pl dias.txt 
 +  1: lunes 
 +  2: martes 
 +  3: miercoles 
 +  % 
 +</code> 
 + 
 +==== 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: 
 +<code> 
 +## ignorar esta linea 
 +1,2 host=ftp.dcc.uchile.cl 4 
 +1,2 host=ftp 3,5,61,2,3,4,5,
 +1,2 host=dcc.uchile.cl 2,5,61,2,3,4,5,
 +1,2 host=dcc.uchile.cl 3,5,61,2,3,4,5,
 +1,2 host=ftp 4,5,61,2,3,4,5,
 +1,2 host=kk 4,5,61,2,3,4,5,
 +1,2 host=dcc 4,5,61,2,3,4,5,
 +1,2 host=dcc.uchile.cl 3,l,61,2,3,4,5,
 +1,2 host=ftp 4 
 +1,2 host=ftp.dcc.uchile.cl 4,5,61,2,3,4,5,
 +1,2 host=dcc. 3,5,61,2,3,4,5,
 +</code> 
 +y queremos hacer un análisis sobre los distintos nombres de computador que aparecen en el log. 
 +<code> 
 +#!/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"; 
 +
 +</code> 
 + 
 +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: 
 + 
 +<code> 
 + #!/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); 
 +</code> 
 + 
 +Otro ejemplo es listar todos los archivos que comiencen con 'a': 
 +<code> 
 +#!/usr/bin/perl 
 + 
 +# lista todos los archivos del directorio actual que empiezan con 'a' 
 + 
 +system("ls a*"); 
 +</code> 
 + 
 +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: 
 +<code> 
 +#!/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 
 +
 +</code> 
 + 
 +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: 
 + 
 +<code> 
 +#!/usr/bin/perl 
 + 
 +# lista todos los archivos del directorio actual que empiezan con 'a' 
 + 
 +foreach (`ls`) { 
 +    print if(/^a/); 
 +
 +</code> 
 + 
 +Si no quiero usar el shell y manejar los nombres internamente, tengo funciones más parecidas a C: 
 +<code> 
 +#!/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"; 
 +</code>
perl.1352772247.txt.gz · Última modificación: 2012/11/13 02:04 por lmateu