perl
Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
perl [2012/11/13 02:04] – creado lmateu | perl [2012/11/27 16:09] (actual) – [Programación en Perl] lmateu | ||
---|---|---|---|
Línea 4: | Línea 4: | ||
[[http:// | [[http:// | ||
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:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
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, | * Para obtener la documentación de la función una función específica, | ||
- | Como complemento también puede consultar los apuntes de Patricio Poblete sobre [[http:// | + | Como complemento también puede consultar los apuntes de Patricio Poblete sobre [[http:// |
- | [[https://wiki.dcc.uchile.cl/ | + | |
+ | También puede encontrar un breve introduccióna | ||
+ | [[http://www.dcc.uchile.cl/ | ||
+ | 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 (<>) { | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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 ' | ||
+ | |||
+ | Primero tomemos un procesador de log de transferencias parecido al del apunte. La bitácora contiene líneas que dicen en alguna parte " | ||
+ | < | ||
+ | ## ignorar esta linea | ||
+ | 1,2 host=ftp.dcc.uchile.cl 4 | ||
+ | 1,2 host=ftp 3, | ||
+ | 1,2 host=dcc.uchile.cl 2, | ||
+ | 1,2 host=dcc.uchile.cl 3, | ||
+ | 1,2 host=ftp 4, | ||
+ | 1,2 host=kk 4, | ||
+ | 1,2 host=dcc 4, | ||
+ | 1,2 host=dcc.uchile.cl 3, | ||
+ | 1,2 host=ftp 4 | ||
+ | 1,2 host=ftp.dcc.uchile.cl 4, | ||
+ | 1,2 host=dcc. 3, | ||
+ | </ | ||
+ | y queremos hacer un análisis sobre los distintos nombres de computador que aparecen en el log. | ||
+ | < | ||
+ | # | ||
+ | |||
+ | # uso de arreglos asociativos | ||
+ | while(<> | ||
+ | { | ||
+ | if( / | ||
+ | $freq_tab{$1} = $freq_tab{$1} + 1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # lo recorro sin ningun orden | ||
+ | foreach $key (keys %freq_tab) { | ||
+ | print " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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: | ||
+ | |||
+ | < | ||
+ | # | ||
+ | |||
+ | # uso de arreglos asociativos | ||
+ | while(<> | ||
+ | { | ||
+ | if( / | ||
+ | $freq_tab{$1} = $freq_tab{$1} + 1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | open(OUT, "| sort -rn" | ||
+ | # select redirige la salida estandar | ||
+ | select(OUT); | ||
+ | foreach $key (keys %freq_tab) { | ||
+ | print " | ||
+ | } | ||
+ | close(OUT); | ||
+ | </ | ||
+ | |||
+ | Otro ejemplo es listar todos los archivos que comiencen con ' | ||
+ | < | ||
+ | # | ||
+ | |||
+ | # lista todos los archivos del directorio actual que empiezan con ' | ||
+ | |||
+ | system(" | ||
+ | </ | ||
+ | |||
+ | 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: | ||
+ | < | ||
+ | # | ||
+ | |||
+ | # lista todos los archivos del directorio actual que empiezan con ' | ||
+ | |||
+ | foreach $name (`ls`) { | ||
+ | print " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Pero en perl siempre existen muchas formas de hacer lo mismo. Primero, eliminando variables innecesarias: | ||
+ | |||
+ | < | ||
+ | # | ||
+ | |||
+ | # lista todos los archivos del directorio actual que empiezan con ' | ||
+ | |||
+ | foreach (`ls`) { | ||
+ | print if(/^a/); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Si no quiero usar el shell y manejar los nombres internamente, | ||
+ | < | ||
+ | # | ||
+ | |||
+ | opendir(FILES," | ||
+ | @files=readdir(FILES); | ||
+ | closedir(FILES); | ||
+ | |||
+ | print join(" | ||
+ | |||
+ | print " | ||
+ | </ |
perl.1352772247.txt.gz · Última modificación: 2012/11/13 02:04 por lmateu