Ejemplos generales

Se muestran ahora unos cuantos ejemplos de one liners , en ocasiones combinados con programas del shell , para ilustrar su uso. Hay muchos más en la Red.

  1. convierte archivos de codificación DOS a UNIX (otra posibilidad es el 'peligroso' argumento -i, de esta manera: perl -i -pe 's/\r//g' DOS.txt):

    $ perl -pe 's/\r//g' DOS.txt > UNIX.txt

  2. convierte todo el texto a mayúsculas:

    $ perl -nle 'print uc'

  3. corta las dos primeras columnas de texto (para las dos últimas es @F[-2,-1]) desde una tubería (usa echo):

    $ echo a b c | perl -lane 'print "@F[0..1]"'

  4. renombra archivos sin sobreescribir los que pudieran pre-existir (combinado con find):

    $ find . | perl -ne'chomp; next unless -e; $original = $_; s/\.dos/\.unix/; next if -e; rename($original,$_)'

  5. sustituye in situ el nombre de una variable en varios archivos de texto, en este caso scripts de Perl, creando copias de seguridad:

    $ perl -i.bak -pe 's/\$var1/\$var2/g' *.pl

  6. imprime las líneas de un archivo que cumplan cualquier expresión regular (parecido a grep):

    $ perl -lne '/expresion regular/ and print'

  7. numera en el terminal las líneas de un archivo:

    $ perl -pe '$_ = "$. $_"'

  8. imprime las primeras veinte líneas de un archivo:

    $ perl -ne 'print "$. $_" if 1 .. 20'

  9. imprime el contenido de uno o más ficheros de atrás hacia adelante (ojo, guarda primero el contenido de cada fichero en memoria):

    $ perl -e 'print reverse(<>)'

  10. cuenta palabras en uno o más ficheros de texto:

    $ perl -lane '$total += scalar(@F); END { print $total }'

  11. para sumar las apariciones totales de cada palabra:

    $ perl -lne 'while(/(\w+)/g){ $total{$1}++ }; END{ print "$_ $total{$_}" for sort{$total{$b}<=>$total{$a}}(keys(%total))}'

  12. para imprimir las líneas de un archivo contenidas entre dos expresiones regulares, por ejemplo los comentarios POD:

    $ perl -nle 'print if /^=/ .. /^=cut/'

  13. genera números aleatorios de 8 cifras, en este caso aplicando la funcion map sobre los valores de un vector (ver secciones 2.7.1 y 2.7.4):

    $ perl -le 'print map { (0..9)[rand(10)] } 1..8'

  14. calcula el valor absoluto de los números de cada fila de un archivo tabular:

    $ perl -alne 'print "@{[map { abs } @F]}"'

  15. selecciona el número más alto de cada fila de un archivo tabular:

    $ perl -lane '@F=sort{$b<=>$a}(@F); print $F[0]'

  16. imprime las líneas de un archivo que cumplan cierta condición, en este caso sobre el número de columnas:

    $ perl -lane 'scalar(@F) > 3 and print'

  17. calcula la transpuesta de una matriz de datos en un archivo de texto como éste, separado con espacios o tabuladores:
    var1	1	2	3	4	5	6
    var2	7	8	9	10	11	12
    ...
    

    $ perl -ane '$f++; for $c (1 .. @F){ $data[$f][$c]=$F[$c-1] }; $maxc=@F if(@F>$maxc); END{ for $c (1 .. $maxc){ for $ff (1 .. $f){ print "$data[$ff][$c]\t" } print "\n"} }'

  18. enumera las permutaciones de un vector, recurriendo al módulo Algorithm::Permute:

    $ perl -MAlgorithm::Permute -le '$l = [1,2,3,4,5]; $p = Algorithm::Permute->new($l); print @r while @r = $p->next'

  19. lanza un servidor temporal para compartir la carpeta actual (./) por el puerto 8000, con ayuda del módulo HTTP::Server::Brick:

    $ cpanm HTTP::Server::Brick 
    $ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'
    

  20. dibuja una doble hélice de ADN infinita (original de www.tbi.univie.ac.at/wash):

    perl -e 'map {print " "x$_->[0],$xx=(keys(%x))[int(rand 4)],"-"x$_->[1],$x{$xx},"\n"} (@_=([5,0],[4,2],[3,3],[2,4],[1,4],[0,3],[0,2],[1,0]),reverse @_) while (%x=(a,t,t,a,g,c,c,g))'

Bruno Contreras-Moreira
http://www.eead.csic.es/compbio