Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccion Al Lenguaje Perl
Introduccion Al Lenguaje Perl
ERL significa Practical Extraction and Report Language, algo as como lenguaje
prctico de extraccin y de informes. Es un lenguaje creado por Larry Wall
(quien, por cierto, es uno de los net-gods ms conocidos en la actualidad) con el
objetivo principal de simplificar las tareas de administracin de un sistema UNIX. En
realidad hoy en da, en su ltima versin, se ha convertido en un lenguaje de propsito
general, y una de las principales herramientas de cualquiera que desee gestionar datos
web en internet.
Es un lenguaje interpretado que tiene varias utilidades, pero est principalmente
orientado a la busqueda, extraccin y formateado de ficheros de tipo texto. Tambin es
muy usado para manejo y gestin de procesos ( estado de procesos , conteo y
extraccin de parmetros caractersticos, etc...).
Es una combinacin de las caractersticas de los lenguajes ms usados por los
programadores de sistemas, como son los shell del sistema operativo UNIX, los utilidad
( que incluye un lenguaje interpretado propio) awk para formateo y tratamiento de texto
e incluso caracteristicas de Pascal, aunque su potencia se basa en la similitud con las
mejores caractersticas del lenguaje estructurado C. En general cualquier utilidad que
se necesite realizar en sh, awk, o sed, se puede implementar de una manera mas
potente y sencilla mediante el lenguaje PERL.
Algunas de las ventajas del uso del lenguaje PERL son las siguientes:
Construccin de pequeos programas que pueden ser usados como filtros para
obtener informacin de ficheros, realizar busquedas, ...
Se puede utilizar en varios entornos, como puede ser Windows 95, OS/2, ..., sin
realizar cambios de cdigo, siendo unicamente necesario la introduccin del
intrprete PERL correspondiente a cada sistema operativo.
Comentarios
Para facilitar la comprensin de un programa no hay nada mejor que explicarlo, y
los comentarios son el medio ideal para hacerlo. Existen por lo menos tres comentarios
que muchos consideran que siempre deben incluirse en un programa: qu hace el
programa, quin lo escribi y cundo inicio y termin de escribirlo, sobre todo en el
contexto de una organizacin. Estos tres simples comentarios pueden hacer la
diferencia entre desestimar un programa como indescifrable o dedicarle algn tiempo
para revisarlo. Adems, se considera prudente comentar dentro del cdigo la forma en
que el programa deber ejecutarse, parmetros, y su sintxis, as como comentar las
estructuras de control como un modo de explicar la funcionalidad al detalle y resaltar
con comentarios las funciones que cumplen las variables.
Sencillez
Es cmodo en ocasiones el comprimir una serie de instrucciones en una sola
lnea, queda al criterio decidir cuando se gana en claridad con un cdigo mas o menos
extenso, pero no debe titubearse en comentar el cdigo que sea complejo.
Bases de datos en PERL
Lo ms fcil es usar el mdulo DBI (que, como todos los dems, est en el
CPAN), con un driver especfico para el gestor de bases de datos, o si hay ninguno
especfico, y la base de datos est accesible usando ODBC, puede utilizarse con
ODBC. En Windows hay un mdulo alternativo, especfico para ODBC, denominado
Win32::ODBC. Con cualquiera de estos dos mdulos, se puede usar con cualquier
sistema de gestin de bases de datos. En Linux y UNIX, se puede usar con MySQL o
MiniSQL, o Postgres. Por ltimo, en Windows se puede usar tambin Microsoft SQL
Server combinado con ODBC. Eso s, como es inherente a las conexiones ODBC, es
una forma menos gil de gestionar una base de datos.
Los caracteres #! sirven para denotar que lo que viene a continuacin hace referencia a
un intrprete de comandos.
Por ejemplo un perl script que mostrara por la pantalla el mensaje HOLA
MUNDO se hara de la siguiente forma:
#! /usr/bin/perl
print "HOLA MUNDO\n";
Este sera uno de los programas ms bsicos en PERL, por no decir el que ms.
Pero, funcionan exactamente igual los programas PERL en Windows y en UNIX? En
general, s. En particular, hay algunas cosas que no funcionan de la misma forma: por
ejemplo, la orden fork no funciona (salvo en la ltima versin), el acceso a base de
datos no se hace igual (se usa el mdulo DBD/DBI en Linux y en Windows,
generalmente, el Win32::ODBC, aunque tambin se puede usar el mismo); para
ejecutar un programa en PERL hay que definir una serie de parmetros. Pero en
general, cualquier programa que no use ninguna caracterstica especfica de un
sistema operativo funciona exactamente igual en los dos sistemas operativos. Y si hay
alguna duda, se puede insertar cdigo particular detectando el valor de la variable
$OSNAME, $^O o $Config{osname}.
Los escalares son los constituyentes de las dems estructuras de datos, por lo que al
explicar los arreglos, hashes, referencias y archivos haremos muchas referencias a
ellos.
Por ejemplo, si queremos definir una variable de tipo escalar llamada numero y que
contenga un el nmero 12 haramos:
$numero = 12;
Para almacenar una cadena de caracteres podemos hacer dos cosas:
Por ltimo, podemos definir varias variables al mismo tiempo utilizando los
parntesis por ejemplo:
($palabra1,$palabra2,$palabra3) = ("Pikachu","Espinete","Don Pimpn");
El tipo de dato vector de escalares es denotado mediante un nombre de variable
precedido del simbolo @. Un ejemplo de inicializacin de una variable de este tipo
podra ser:
@frutas = ("manzana","pera","naranja","fresa");
El nmero de elementos menos uno de un vector de escalares se puede obtener
mediante el nombre de la variable precedido de los simbolos $#, por ejemplo si
queremos obtener el nmero de elementos de @frutas haramos:
$numero_de_elementos = $#frutas+1;
Para ser ms exactos $# nos devuelve el ltimo indice del vector, as, si el valor
para el primer indice es 0 el nmero de elementos - 1 ser el ltimo valor permitido
para indexar el vector.
El acceso a un elemento de un vector se hace mediante un ndice numrico de
la forma $nom_variable [ indice ] ; asi, si quisieramos acceder al tercer elemento de
@frutas haramos:
$2_elemento = $frutas[2];
Esta lnea, lee otra lnea de texto y la coloca en la variable $edad (con retorno
de carro includo).
ARREGLOS EN PERL
Para ndices, al igual que para hashes, tambin puede usarse el valor de
variables o de expresiones para especificar el ndice.
EQUIVALENCIAS DE CLASES
Como ya revisamos, al hacer referencia a un elemento particular de un arreglo o hash
obtenemos un escalar (en ves de todo el arreglo o hash). Este tipo de "cambios" de
clase son el propsito de esta seccin, pues pueden resultar algo confusos aunque,
una vez comprendidos, dan una buena parte de las caractersticas peculiares de PERL.
Bsicamente, PERL distingue dos tipos de contextos para evaluar una
expresin: como escalar y como arreglo.
El primero se refiere a las expresiones que han de regresar un escalar (del tipo
que sea) como resultado, y el segundo a aquellas expresiones que han de regresar un
arreglo o conjunto de escalares como resultado. Muchas expresiones pueden ser
evaluadas en ambos contextos y obtener, segn el contexto, un resultado distinto, esto
lo revisaremos con cuidado conforme vayamos revisando estas expresiones.
Revisemos los cambios que ocurren a los datos de una cierta clase cuando los
evaluamos en otro contexto:
Las transiciones mas utilizadas son las de arreglo a escalar, las de arreglo a hash y de
hash a arreglo, la primera porque permite conocer el tamao de los arreglos y las
segundas porque proveen los mecanismos para inicializar los hashes con arreglos
constantes y para "acondicionarlos" con fines de almacenamiento e impresin.
A menudo, se representa un arreglo con una sola cadena que contiene separadores
para los diversos elementos, PERL implementa la funcin "split" que divide estas
cadenas en arreglos, su sintxis bsica es:
split($delim,$cadena)
Donde $delim es la expresin que representa los delimitadores de elementos
y $cadena es la cadena a dividir.
Como ya se mencion, generar un arreglo de cadenas donde los elementos
son las subcadenas de $cadena que estn separadas por cadenas $delim.
Por ejemplo, una cadena como:
$registro="pikachu@pokemon.com";
@reg=split(":",$registro);
print "Nombre:$reg[0]\nEdad:$reg[1]\nEmail:$reg[2]\n";
Genera un resultado similar a:
Nombre:Pikachu
Edad:6
Email:pikachu@pokemon.com
En PERL existen formas de hacer determinadas cosas imposibles con otros tipos.
Adems,
Referencias
Este tipo de datos es exclusivo de PERL 5, ya que PERL 4 usaba los type globs para
realizar algunas de estas funciones, pero el proceso es mucho mas complicado y
obscuro.
Las referencias son el equivalente lgico de los punteros, son un tipo de dato
que no contiene informacin en s misma, sino que permite manejar indirectamente los
datos contenidos en otra entidad.
Las referencias, sin embargo, no forman una clase nueva de datos, sino que son
tratados como un tipo ms de escalar.
La definicin de referencias se realiza por el operador referencia "\" (backslash) ,
funciona de modo similar a "&" en C, y aunque a diferencia de C no hay un operador de
de referencia, la sintxis para acceder al dato original es muy sencilla.
A diferencia de C, los objetos que creemos mediante referencias no quedan
como cadveres en memoria, PERL lleva un registro de las diversas referencias a cada
elemento en memoria y automticamente lo destruye cuando descubre que nadie hace
ya referencia a l, de modo que pueden usarse las referencias sin miedo, aunque con
la precaucin necesaria para no perder los datos que se almacenan en ellas.
Creacin
Podemos crear referencias de varias formas, siendo las ms sencillas y tiles las que
se citan a continuacin.
Usando el operador de referenciacin en una variable, o valor, en el caso de una
variable, es crear un medio alterno de acceder al valor de la variable.
$rescalar=\$escalar;
$rarreglo=\@arreglo;
$rhash=\%hash;
$rrutina=\&subrutina;
Creando objetos "annimos" que solo pueden ser utilizados por medio de la referencia.
Escalares
$rescalar=\"hola"; #referencia a la cadena annima "hola"
Arreglos:
Esquemas condicionales.
Esquemas iterativos.
if($entrada < $numero) {print "El numero introducido es menor que el pensado.\n";}
print" El nmero pensado era:",$numero;
if (EXPRESION) BLOQUE else BLOQUE.
Un ejemplo podria ser el siguiente:
print" Pensando un nmero...\n";
$numero = rand(100); print" Introduce un numero del 1 al 100:";
$entrada = <STDIN>;
if($entrada == $numero)
{
print"Has acertado el numero\n";
}
else
{
if($entrada > $numero)
{
print"El numero introducido es mayor que el pensado.\n";
}
else
{
print "El numero introducido es menor que el pensado.\n";
}
}
if (EXPRESION) BLOQUE elsif (EXPRESION) BLOQUE .... else BLOQUE.
Un ejemplo podria ser el mostrado a continuacin:
print" ensando un nmero...\n";
$numero = print(100); print" Introduce un numero del 1 al 100:";
$entrada = <STDIN>;
if($entrada == $numero)
{
print"Has acertado el numero\n";
}
elsif($entrada > $numero)
{
print"El numero introducido es mayor que el pensado.\n";
}
else
{
print "El numero introducido es menor que el pensado.\n";
}
En lugar de if podemos usar unless que tiene el significado contrario. Dentro de los
esquemas iterativos tenemos:
sub HOLA
{
print "HOLA\n";
}
La llamada a la subrutina la haramos usando do nombre_de_la_subrutina(); o
&nombre_de_la_subrutina; Las dos formas producen el mismo resultado con la
excepcin de que en el caso de do hay siempre que poner los parntesis, si queremos
pasar argumentos debemos pasar los argumentos entre estos parntesis, y estos sern
almacenados en el vector de escalares @_, es decir para saber el numero y el valor de
los argumentos pasados a una subrutina hay que leer de este vector predefinido. Un
ejemplo podra ser el siguiente:
sub imprime
{
local($cadena)=@_;
print $cadena;
}
&imprime ("HOLA\n");
En el ejemplo anterior se usa la funcin local(), que sirve para declarar variables
locales a la subrutina, por supuesto podramos haber hecho referencia directamente a
el vector @_. El valor devielto por la subrutina es el de la ltima expresin evaluada, y
puede ser tanto un vector como un escalar. Tambin podemos devolver explicitamente
un valor usando return, como en C.
Tambin resulta interesante la declaracin y uso de formatos o reports. Con la
definicin de un report, estamos alterando el formato de salida de los registros cuando
utilizamos la funcin write. La sintxis para la definicin de un formato es:
format NOMBRE =
FORMLIST
.
Si NOMBRE se omite, entonces STDOUT es tomado como el dispositivo de
salida. FORMLIST contiene el formato de la salida de la forma:
TABULACIN_CAMPO1,TABULACIN_CAMPO2,...,TABULACIN_CAMPON
variable1, variable2,.........,variablen
El tipo de tabulacin se consigue usando los smbolos:
< : tabulacin a la izquierda.
> : tabulacin a la derecha.
| : texto centrado.
Pondremos tantos smbolos como la longitud mxima requerida para representar el
valor de la variable asignada a ese campo, adems al principio de la definicin de los
campos de tabulacin debe estar el smbolo @.
OPERADORES EN PERL
PERL soporta una gran cantidad de operadores, la mayoria de ellos heredados del
lenguaje C. En PERL los operadores conservan el mismo uso que en el resto de
lenguajes, y se utilizan para realizar operaciones aritmeticas, operaciones logicas ...,
entre las variables del programa. Los operadores pueden clasificarse en los siguientes
tipos:
Operadores de comparacin: mediante estos operadores podemos enfrentar
dos expresiones, de manera, que dependiendo de su valor se generar un
resultado que puede ser lgico o numrico. PERL tiene los siguientes
operadores de comparacin:
== . Este operador sirve para comparar dos valores iguales, de manera
que cuando las expresiones a su izquierda y su derecha son iguales,
devuelve un valor lgico verdadero y cuando no lo son devuelve falso:
Error!Referencia de hipervnculo no vlida. ($var == 3) { ...}
Supongamos que tene una archivo de tipo texto con el siguiente contenido:
tres perros tres gatos y tres elefantes.
Las siguientes expresiones regulares casuarn los efectos que se especifican:
open(AR,'prueba.prb')|| die"$!\n";
while (<AR>)
{
if($ = s /tres/
{ print "Se ha encontrado la cadena 'tres'";}
}
El segmento de codigo anterior realiza las siguientes operaciones: abre un
fichero prueba.prb de tipo texto y lo asigna a la variable AR, trs lo que realiza
un bucle while que permite recorrer todo el contenido del fichero. Dentro de este
bucle, utilizando la variable predefinida $_ (que guarda el contenido de la ltima
linea del fichero definido como entrada); observa mediante una condicin if si
dentro del registro existe una cadena igual a 'tres'. Como se ve dentro de la
condicin se utiliza una expresin regular de comparacin que devolvera cierto
si se encuentra la cadena patrn dentro de la variable ( en este caso el
contenido de una lnea). En el caso de que la expresin regular devuelva cierto
se indica que se encontr la cadena buscada.
open(AR,'prueba.prb')|| die"$!\n";
while (<AR>)
{
$ = s/tres/---/g;
print;
}
Este ejemplo, entra de manera similar al anterior dentro del fichero prueba.prb,
tras lo que sustituye dentro de este fichero todas las ocurrencias de la cadena
'tres' por la cadena '---'. Esto se realiza mediante una expresin regular de
sustitucin. Con esto la salida por pantalla sera la siguiente:
--- perros --- gatos y --- elefantes.
open(AR,'prueba.prb')|| die"$\n";
while (<AR>)
{
$ = tr/tre/1234/;
print;
}
La salida por pantalla de este ejemplo es la siguiente:
123s p322os 123s ga1os y 123s 313fan13s.
El cdigo anterior realiza una traduccin en el contenido de nuestro fichero
prueba.prb, el cual es abierto de la misma manera que en los otros casos. Como
se ve en el resultado, cada vez que hay una ocurrencia del caracter 't' este se
sustituye por '1', cuando aparace un caracter 'r' la sustitucin se hace por el '2' y
por ltimo cuando aparace un caracter 'e' la traduccin lo sustutituye por el
$var =~ s/usted(es)?/---/;