3- PROGRAMACIÓN ESPECIAL

3.1- Uso de Perl en línea, Tareas Comunes

3.1.1- Formas de Especificar el programa

3.1.2- Interruptores

3.1.3- Tareas Comunes de Perl en Línea de Comando

3.1.3.1- Reemplazar una cadena en un archivo por otra

3.1.3.2- Imprimir algún campo de un archivo


3- PROGRAMACIÓN ESPECIAL

En la Seccion 2, revisamos la programación básica en Perl, pero la programación en este lenguaje se basa, sobretodo, en gran cantidad de optimizaciones y formas alternativas de realizar tareas comunes lo que le dá una funcionalidad adicional que lo hace en extremo valioso en la realización de estas tareas o aquellas que las requieran.
Por eso es que dedico toda una sección de este tutorial a tratar estas características y el modo de emplearlas, para que el nuevo programador, no solo pueda elaborar programas en Perl, sino que pueda explotarlo para facilitar la realización de sus tareas mas usuales.

3.1- Uso de Perl en línea, Tareas Comunes

Una de las características de Perl dada su semi naturaleza de interprete es que puede ser ejecutado y actuar como un interprete de comandos (aunque los ejecuta hasta el momento de terminar todas las instrucciones con un fin de archivo desde teclado.

Además, Perl tiene varias opciones en línea que son de extraordinaria utilidad, por ejemplo, para substituir cadenas a lo largo de todo un archivo, o indicar que los errores se expresen en un formato mas entendible (en caso de que no este como default desde que lo compilamos), etc.

Esta sección, se dedica a revisar algunos de estos parámetros de Perl enfocado a usos específicos.

3.1.1- Formas de Especificar el programa

Existen tres métodos de indicar a Perl cual ha de ser el script a ejecutar:

1- Ejecutando un script directamente que especifique la colocación de Perl con una línea que inicie con "#!"

2- Pasando el script por la entrada estándar a Perl (completo con todo y fin de archivo), Pero esta opción no admitirá parámetros para el script.

3- Especificado las instrucciones en línea de comando con el interruptor -e. Esta la revisaremos con cuidado cuando veamos los interruptores.

3.1.2- Interruptores

En esta sección no intento revisar todos los interruptores descritos en la sección PERLRUN de la referencia, sino solo algunos de ellos enfocados a comprender mejor el como se realizan algunas tareas con Perl en línea de comando, y el orden también ha sido modificado tratando de hacer mas fácil su comprensión.

-e comando

Este interruptor se usa para indicar una línea de código en Perl a ejecutar (nota solo una, completa con ";"), si se da este interruptor, Perl no buscara un nombre de script en la lista de argumentos ,ni la recibirá por la entrada estándar. Para formar un script de varias líneas, se puede dar varias veces este interruptor con líneas distintas.

-n 

Hace que Perl asuma que existe el ciclo siguiente alrededor del script que le damos:

while(<>)
{
   #aqui va el script
}
-p

Al igual que "-n" hace que Perl asuma un ciclo alrededor del script, pero además, hace que imprima automáticamente el ultimo valor evaluado de cada ciclo del script, lo que equivale al siguiente ciclo:

while(<>)
{
  #El script va aquí
} continue
{
  print;
}

El uso del interruptor -p inhibe al interruptor -n.

-a

Al estar usando un interruptor "-e" o "-p" hace que los renglones que se van leyendo en el ciclo del "-n" o "-p" pasen por un "split" con el delimitador especificado con el interruptor -F y sean asignados, ya como arreglos a @F, resultando en la siguiente estructura del while:

while(<>){
  @f=split(' ');
  #aqui va el script
}
-F

Con este interruptor determina una expresión regular la cual se usara como delimitado para el split del switch "-a", se puede poner el patrón entre "/" siendo estos ignorados. Nota: los interruptores -a y -F son exclusivos de Perl 5.

-iextencion

Especifica que los archivos procesados por "<>" sean editados en su lugar, esto es, que el archivo de entrada sea movido a otro archivo con la extensión especificada, y que en el archivo original se vayan escribiendo los resultados que generemos. Si no se especifica ninguna extensión, al final del proceso no habrá ningún archivo con la información original.

-v

Imprime la versión y nivel de parches del ejecutable de Perl.

-w

Imprime advertencias sobre identificadores que se usen solo una vez, escalares que se usan sin haber recibido valor, subrutinas indefinidas, archivos sobre los que intentemos de realizar operaciones para las que no fueron abiertos, etc. Se recomienda para diagnosticas problemas en los programas.

Habiendo revisado algunos interruptores, ahora vamos a ver algunos ejemplos de las cosas que podemos hacer con ellos.

3.1.3- Tareas Comunes de Perl en Línea de Comando

Entiéndase por Línea de Comando, que desde nuestro interprete de comandos, invocamos Perl con los parámetros adecuados para que realice una función sin necesidad de haber escrito un script, por supuesto, no son tareas muy complejas, pero llegan a ser deslumbrantemente útiles.

3.1.3.1- Reemplazar una cadena en un archivo por otra

Es muy común que, por ejemplo, deseemos reemplazar todas las ocurrencias de, digamos, un camino y nombre de programa, por otro en un archivo de texto que podría ser el código fuente de un programa o alguna otra cosa, muchos procesadores de palabra soportan este tipo de procesos, pero con Perl no se requieren herramientas extra y podemos trabajar de un solo golpe grandes cantidades de archivos.

el comando seria de la forma:

Perl -pi.bak -e "s/CADENA1/CADENA2/g;" archivo1 archivo2 archivo3

Recordando lo que significan los interruptores:

-p indica que alrededor de la instrucción tenemos un ciclo que revisara todas las líneas de todos los archivos que se pasen como parámetros a script, además, que los resultados se imprimirán (a la salida estándar). Como este interruptor no recibe valores, puede acompañarse de otro interruptor (en este caso, "-p -i" es equivalente a "-pi").

-i Los archivos procesados serán editados en línea, generando respaldos de estos con la extensión .bak, la salida estándar del bloque de "-p" se redirecciona a los archivos origianles, de modo que los resultados del script serán el nuevo contenido de los archivos originales.

-e El comando a ejecutar dentro del ciclo, y cuyo resultado será el nuevo contenido de los archivos es una substitución (usamos implícitamente el argumento default $_ para indicar sobre que se hace la substitución), el comando, es una substitución del patrón en toda la línea leída.

archivo1 archivo2 archivo3 Son los archivos que usa el ciclo de "-p" que, como en el caso de cualquier otro script que usa "<>" son recibidos como parámetros.

El resultado final es que generamos archivo1.bak, archivo2.bak, archivo3.bak y archivo1, archivo2 y archivo3 y en los últimos la CADENA1 ha sido reemplazada por CADENA2.

3.1.3.2- Imprimir algún campo de un archivo

En UNIX, gran parte de la información del sistema se almacena en archivos de texto con separadores para indicar campos, siendo cada renglón un registro, además, como un ejemplo sencillo, planteemos una ejecución en línea de Perl que imprima todos los logins del etc/passwd que pertenezcan a un cierto grupo, digamos, el 100.

Perl -anF: -e 'if($F[3]==100){print "$F[0]\n";}' /etc/passwd