Este material no estaría completo sin ejemplos del uso de Perl desde el terminal, que sin duda sirven de muestra del poder de este lenguaje también como herramienta cotidiana. Para ello debemos conocer algunos argumentos del intérprete Perl especiales para su uso en el terminal.
Como vimos de pasada en la sección 2.1.1, uno de los argumentos posibles es -w
,
para mostrar todos los avisos del intérprete, y otro es -e
, que compila y ejecuta lo que
escribamos entre 'comillas sencillas' en el terminal como un programa, en vez de abrir un fichero con código.
En este contexto podemos además aplicar otros argumentos:
-n
para leer línea a línea el contenido de todos los archivos pasados como argumentos, con un bucle while(<>){ ... }
-p
modificación de -n
que además imprime cada línea leída a stdout
-l
por defecto añade un salto \n
a cada línea leída con -n
o -p
Por defecto, Perl separa los datos de entrada, normalmente un archivo o una tubería
( pipe ), en líneas. Si queremos cambiar
ese comportamiento necesitamos indicarlo por medio del argumento -0
(es un cero). Por ejemplo, para separar texto en párrafos
podemos usar -00
. Si necesitamos diseccionar el contenido de cada línea, por ejemplo en forma de columnas,
recurrimos a estos dos argumentos:
-a
para aplicar la función split
a las línea leídas (descrita en el apartado 2.7.2)
-F'separador'
para indicar la expresión regular para split
, el separador de columnas, que quedan guardadas en el vector @F
Podemos invocar funciones de cualquier módulo instalado en el sistema mediante estos argumentos:
-I
para indicar rutas a módulos, como en -I/home/usuario/lib/
-M
importa un módulo, como en -Mstrict
Quisiera mencionar también el argumento -i
, que permite cambiar el contenido de un fichero in situ , que es conveniente
usar con mucha prudencia para no destruir accidentalmente archivos. Para ello es recomendable mantener siempre copias de los archivos originales,
por medio de la sintaxis -i.bk
, que en este caso guarda copias con la extensión .bk
de todos los ficheros procesados.
Ya que hemos visto que las expresiones one liners se ejecutan línea a línea, puede ser muy útil
emplear bloques END{}
, puesto que lo allí contenido se ejecuta únicamente al terminar de procesar todas las lineas. En la siguiente sección
hay algunos ejemplos que lo explican.
OJO: En la Red es frecuente encontrar expresiones que contienen algo que parece un operador, }{
, que no es otra cosa
que una manera casi ilegible de separar el código de cada línea y el que se debe ejecutar al final, como en END.
Ejemplo: $ perl -lpe'}{$_=$.' /etc/passwd
(tomado de perlmonks).
Finalmente, es muy posible que tus expresiones Perl en el terminal salgan ganando si utilizas las variables especiales de Perl.
Como ejemplo del ahorro de escritura que permiten estos argumentos muestro ahora el mismo algoritmo,
-w
para mostrar avisos del intérprete (2.1.1):
perl -wnl -e 'print;'
#!/usr/bin/perl -w # comprueba si hay argumentos o pipes entrantes @ARGV or @ARGV = '-'; foreach my $fichero (@ARGV) { open(FICH,$fichero) || warn "$0: no puedo abrir $fichero\n"; while(<FICH>) { print; } close(FICH); }