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: por lmateu
