PerlScript

El lenguaje de programación PERL (Lenguaje Práctico de Extracción e Informes), es un lenguaje de propósito general, interpretado, y que ha tenido una amplia aceptación en el desarrollo de aplicaciones CGI (scripts de servidor).

Normalmente no se habla de programas Perl, sino de ‘scripts’ Perl, debido a que su uso está generalizado en el entorno de la programación web para ejecutar tareas del lado servidor y dar dinamismo a las páginas web (de ahí que se pueda hablar indistintamente de desarrollos web en lenguaje Perl o PerlScript -del lado servidor-).

Aunque se trata de un lenguaje multiplataforma, su uso ha sido mucho más extendido en entornos Unix/Linux. A pesar de ello, podemos encontrar versiones para casi todos los sistemas operativos. Sin embargo, debe tener presente que no todo el código escrito para un script en entorno Linux le puede valer para entornos Windows, y posiblemente deba hacer adaptaciones. En este apartado nos referiremos exclusivamente a código para entorno Linux. Puede visitar nuestro artículo sobre CGI para más información sobre el uso de CGIs en entorno Windows.

Presentamos a continuación algunos principios básicos de la programación en Perl, mostrando de forma sencilla las bases para el desarrollo de scripts del lado servidor en este lenguaje. Para una completa referencia al mismo, así como más información sobre sus funciones y características, consulte la web de PERL.

Aplicaciones del lenguaje PERL

PERL es un lenguaje de propósito general, por lo que puede ser utilizado para realizar todo tipo de aplicaciones. Sin embargo, su facilidad para el manejo de cadenas de texto lo convirtió en uno de los lenguajes más utilizados para el desarrollo de scripts CGI en Internet, que aún, hoy día, sigue utilizándose de manera habitual, aunque ya existen alternativas más específicas, como PHP.

Con la existencia de numerosos módulos de librerías adicionales, PERL ofrece facilidades para la programación de tareas más específicas, como es, por ejemplo, el acceso a bases de datos, lo que complementa su funcionalidad en el desarrollo de aplicativos web.

Debido a la extensión de scripts en este lenguaje entre los programadores de aplicaciones web, puede encontrar por Internet numerosos desarrollos que podrá incorporar a su Plan de Alojamiento Web.

Breve referencia al lenguaje

De modo escueto, le presentamos a continuación una referencia rápida al lenguaje para que le sirva de guía y pueda asimilar posteriormente con más sencillez el resto de características que encuentre sobre el mismo en manuales más extensos.

Sintaxis básica

  • Indicación del intérprete PERL. La escritura de scripts PERL en entorno Linux/Unix obliga inicialmente a indicar la ruta en disco al intérprete PERL. Para ello se debe utilizar la siguiente sentencia como primera línea de código de su página:#!/usr/bin/perl

    Tenga en cuenta que esta línea de código no es necesaria en el caso de escritura de scripts en entorno Windows, donde la especificación de uso del intérprete PERL viene asociada a la extensión del archivo (.pl).

  • Generación de HTML. Cuando su programa CGI deba generar una respuesta en forma de página HTML (la mayoría de las ocasiones), lo primero que deberá escribir en su salida estándar, es una cabecera con la indicación al tipo de información que sucede en el código (el tipo MIME). El código de esta cabecera debe ser como el siguiente:print "Content-type: text/htmlnn";
  • Separador de instrucción. Para indicar que una instrucción ha acabado y que empieza la siguiente, se utiliza (igual que en C o C++) el separador punto y coma ‘;’. Este separador es opcional al final de un bloque (conjunto de sentencias delimitadas entre llaves ‘{…}’).
  • Comentarios. Para indicar un comentario en lenguaje PERL deberá usar el carácter almohadilla ‘#’. El alcance del comentario es, desde dicho carácter hasta el final de la línea en la que aparezca.

Veamos un ejemplo para mostrar los puntos anteriores sobre la sintaxis básica:

#!/usr/bin/perl

#Insertamos la cabecera de indicación de contenido HTML
print "Content-type: text/htmlnn";

#Mostramos en el navegador una frase de bienvenida
print "Hola mundo";

Variables y tipos

Como lenguaje de programación, PERL posee variables. Sin embargo, a diferencia de otros lenguajes, la definición del tipo asociado a una variables es particular: el tipo lo define el carácter que precede al nombre de la variable. Existen 4 tipos principales de variables: los handlers (manejadores) de ficheros, los escalares, los arrays y los hashes.

Escalares

Las variables escalares permiten almacenar números enteros o en coma flotante y cadenas de caracteres. Se definen precediendo al nombre el carácter dólar ‘$’.

Ejemplos:

$valor = 10;                 #variable numérica
$epsilon = 1.0e-22;               #variable en coma flotante
$frase = "Hola mundo";  #cadena de caracteres

Arrays

Las variables de tipo array almacenan un conjunto de elementos escalares indexados a través de un número. Se definen precediendo al nombre el carácter arroba ‘@’. Cada uno de los elementos de un array es de tipo escalar, y se identifica a través de su índice. Se puede representar un array con un conjunto de valores entre paréntesis y separados por comas.

Ejemplos:

@ventas = (1, 2, 3, 4, 5);   #array de 5 valores numéricos
print $ventas[0];    #mostramos el primer valor del array (posición 0)
@ventas[1,3] = (11,33);   #damos nuevo valor a las posiciones 1 y 3

Hashes

Los hashes almacenan un conjunto de elementos indexados por una cadena de caracteres. Se definen precediendo al nombre con el carácter porcentaje ‘%’. En esencia son similares a los arrays, excepto en la indexación de sus elementos. El operador de indexación en este tipo de variables son las llaves: {}.

Los hashes definen una asociación entre el índice (key o clave) y su valor, definiendo por convención una lista cuyos valores son, primera clave, primer valor, segunda clave, segundo valor, etc.

Existen funciones específicas para obtener un array con los valores y claves de un hash, las funciones values y keys.

Ejemplos:

%ventas = ('enero', 100, 'febrero', 200, 'marzo', 250);
#otra forma más clara de almacenar datos en un hash
%ventas = ('enero' => 100, 'febrero' => 200, 'marzo' => 250);
$ventas {'enero'} = 100;  #el valor de la clave enero es 100;
print keys(%ventas);      #escribimos las claves del hash

Handlers

Los handlers de fichero son variables que representan un flujo de caracteres que permiten la entrada salida de datos sobre dicho fichero. En este caso, el nombre no va precedido de ningún carácter específico. Suelen indicarse en mayúsculas. Existen tres variables de fichero predefinidas: STDIN (entrada estándar), STDOUT (salida estándar) y STDERR (salida de error predefinida -que suele coincidir con la salida estándar-).

Ejemplo:

open (FICHERO, "<datos.txt") or
die "No se pudo abrir el fichero datos.txt"

Expresiones regulares. Quoting. Patrones y operadores.

Las expresiones regulares son la base del lenguaje PERL. Precisamente una de las ventajas de este lenguaje es su capacidad para la manipulación y tratamiento de cadenas de caracteres, que se ve claramente definida por el uso de expresiones regulares para el reconocimiento de las mismas.

Quoting

Como acabamos de indicar, uno de los aspectos más importantes de PERL es el manejo de las cadenas de caracteres. En este sentido, el lenguaje es muy flexible a la hora de la construcción de las cadenas, especificadas mediante los caracteres tipo comilla. Es lo que se denomina quoting.

Existen dos tipos principales de entrecomillado: el simple y el doble:

  • Las comillas dobles sirven para indicar cadenas de caracteres que, además, permiten la sustitución de variables en su interior.

    Ejemplo:

    $mundo = "mundo!";
    print "Hola $mundo";    #escribe Hola mundo!

    Para poder indicar caracteres especiales como la comilla doble, dentro de una cadena, se utiliza el carácter contrabarra ‘‘.

    Ejemplo:

    $mundo = "mundo!";
    print ""Hola $mundo""; #escribe "Hola mundo!"
  • Las comillas simples identifican a cadenas de caracteres que no permiten sustitución de variables en su interior.

    Por ejemplo:

    $mundo = "mundo!";
    print 'Hola $mundo';   #escribe Hola $mundo

Metacaracteres y referencias

Las expresiones regulares más sencillas son aquellas que se forman por los caracteres que se identifican a sí mismos.

Por ejemplo, la expresión /Hola/ identifica a la cadena “Hola”.

Sin embargo, pueden encontrarse dentro de una expresión, caracteres especiales denominados metacaracteres que pueden modificar su significado:

  • El carácter ‘ | ‘ identifica alternativas. Por ejemplo: /yo|tu/ identifica a las cadenas “yo” y “tu”.
  • El metacaracter ‘^‘ indica que la expresión debe asignarse solo con el inicio de la cadena.

    Por ejemplo, la expresión /^mas/ reconoce la cadena “masa” pero no “amas”.

    El metacaracter ‘$‘ se comporta igual pero al final de una cadena.

  • El punto ‘.‘ identifica a cualquier carácter (excepto al de fin de línea ‘n‘).
  • Una lista de caracteres entre corchetes identifica a un grupo de caracteres y se asigna a cualquiera de los elementos incluidos en el mismo. Si se precede de un acento circunflejo ‘^‘ el grupo es el opuesto. Se permite el uso de rangos (identificados con dos puntos).

    Por ejemplo: /[a..z]/ identifica a cualquier carácter en minúscula entre dichas letras.

    También existen cadenas de escape que identifican a caracteres especiales.

    Por ejemplo: ‘n‘ es el carácter nueva línea; ‘s‘ es un espacio en blanco; etc.

    Además, existen una serie de cuantificadores que identifican el número de apariciones que deben ocurrir en una cadena:

    • * cero o más veces.
    • + una o más veces.
    • ? cero o una veces.
    • {n} n veces exactamente.
    • {n,} al menos n veces.
    • {m,n} entre m y n veces.

    Por ejemplo: /[a+]/ se asocia a aquellas cadenas que tengan al menos una “a”.

Operadores

Los operadores son símbolos que permiten realizar “operaciones” entre distintos tipos de datos. En PERL podemos organizarlos en diversos grupos, que indicamos a continuación de modo reducido:

  • Aritméticos. Son los habituales para las operaciones numéricas: + (suma) , (resta), * (multiplicación), / (división) y ** (exponenciación). También se pueden usar los operadores unarios ++ (autoincremento) y (autodecremento).
  • Lógicos. && (AND), || (OR) y ! (NOT). Que permiten establecer criterios de condición.
  • Relacionales numéricos. Que permiten comparar valores numéricos: < (menor), > (mayor), == (igual), >= (mayor o igual), <= (menor o igual), != (distinto), <=>(que devuelve 0 si son iguales, 1 si el primer operador es mayor que el segundo y -1 si el segundo es mayor que el primero).
  • De cadenas. Existen dos operadores básicos de cadenas. La concatenación, con el carácter punto ‘.’ y la repetición con el carácter equis ‘x’. Ejemplos: “a “.”b” devuelve “a b”. “hola” x 4 devuelve “holaholaholahola”.
  • Relacionales de cadenas. Permiten realizar comparación lexicográfica de cadenas. Los operadores son: eq (igual), ne (no igual), lt (menor), le (menor o igual), gt (mayor), ge (mayor o igual) y cmp (comparación con signo, equivalente al operador numérico <=>). Por ejemplo, “0” eq “00” devuelve falso.
  • De expresiones regulares. Nos permiten operar con las expresiones regulares de variadas formas. Algunos de ellos son:m// (match). Opera por defecto sobre la variable ‘$_‘ (que es una variable especial que contiene el operando por defecto). Sin embargo, se puede especificar la cadena sobre la que operar, usando el operador ‘=~‘. Se puede obviar el uso de la letra m en el operador match.

    Ejemplo:

    if ("Hola" =~ /^Hola$/) print "Coincide!";

    El operador match permite algunas opciones que se especifican por medio de una letra al final del operador. Por ejemplo, ‘g‘ encuentra todas las ocurrencias del patrón y las devuelve en formato de lista; ‘i‘ ignora mayúsculas y minúsculas; etc.

    Ejemplo:

    print "También coincide" if ("Hola" =~ /^hola$/i);

    s/// (sustitución). Es el operador más importante de los asociados a expresiones regulares. Permite realizar sustituciones de partes de una cadena sobre otra. Se le pasan como argumentos el texto a encontrar y el texto por el que se sustituye el encontrado.

    Ejemplo:

    $var = "primero segundo";
    $var =~ s/o/a/g;   #sustituye todas las apariciones de 'o' por 'a'

    tr/// (traducción). Traduce cada carácter de la parte izquierda por el indicado en la parte derecha.

    Ejemplo:

    $var = "mayúsculas";
    $var =~ tr/mayúsculs/MAYUSCULS/;

Estructuras de control

Las estructuras de control nos permiten efectuar repeticiones (bucles) y bifurcar la ejecución de un programa cuando se cumplan ciertas condiciones. Podemos encontrar múltiples estructuras de control en PERL. Todas actúan sobre bloques de sentencias que se organizan entre llaves. Vamos a enumerar en este punto la sintaxis de algunas de ellas.

if..elseif..else

Permite la ejecución condicional de fragmentos de código. Su sintaxis básica es la siguiente:

if (expr) bloqueif
[elseif  bloque_elseif]
[else bloque_else]

Lo que significa que si, tras evaluar ‘expr’ devuelve un resultado verdadero (TRUE), se ejecutará lo indicado en ‘bloqueif’.

Opcionalmente, puede añadirse la opción else a la estructura condicional if, indicando que en caso de que no se cumpla ‘expr’ se ejecute lo indicado en ‘bloqueelse’ tras el else. También puede indicarse de manera opcional la opción elseif, que no es más que una forma compacta de indicar una nueva sentencia if tras un else.

Las sentencias if son anidables.

Ejemplo:

if ( $a > $b ) {
     print "a es mayor que b" ;
  } elseif ( $a == $b ) {
     print "a es igual que b" ;
  } else {
     print "a es menor que b" ;
  }

while

Se trata de una sentencia tipo bucle. Su sintaxis básica es la siguiente:

while (expr)
   bloque

Indica que se ejecute lo indicado en ‘bloque’ mientras se cumpla a cierto la condición indicada en ‘expr’. Normalmente en ‘expr’ se incluye algún condicionante que es modificado en las sentencias del bloque, de manera que en cada iteración se vuelve a evaluar el resultado hasta que un cambio en el mismo provoca una evaluación a false, y por tanto, la salida del bucle.

También las sentencias while son anidables.

Ejemplo:

$indice = 1;
while ( $indice < 10 ){
   print "$indicen";
   $indice = $indice + 1;
}
print $indice;

for

Es otra sentencia tipo bucle. Al igual que el while, es similar a la misma sentencia del lenguaje C. Su sintaxis básica es la siguiente:

for (expr1; expr2; expr3)
   bloque

La primera expresión ‘expr1’ se ejecuta siempre y una única vez al principio del bucle.

Al comienzo de cada iteración, se evalúa ‘expr2’. Si se el resultado es verdadero el bucle continúa y se ejecutan las sentencias del bloque, y si es falso, se sale del bucle.

Al final de cada iteración se ejecuta ‘expr3’.

Realmente, puede usar while o for para un bucle según su decisión, dado que se puede escribir código que ejecute el mismo resultado usando uno u otro bucle indistintamente.

Ejemplo:

for ($i = 1; $i < 10; $i = $i + 1)
   print "$in";
print $i;

foreach

Se trata de una variación del bucle for, que recorre todos los elementos de un array en orden, asignando a una variable en cada iteración, el valor correspondiente al elemento actual.

Ejemplo:

foreach $elemento (@lista)
   $elemento += 2; #sumamos 2 a cada elemento de la lista
print @lista; #mostramos el resultado

Subrutinas

Una subrutina no es más que un conjunto de sentencias que devuelven un resultado tras su ejecución. Dentro de estas sentencias pueden incorporarse llamadas a otras funciones.

El resultado depende normalmente de una serie de valores (parámetros) que se suelen facilitan en la llamada a la función. En esencia, es un modo de evitar la repetición de código y facilitar por tanto la programación.

Las funciones pueden ser definidas por el usuario, o bien pueden pertenecer a una serie de funciones ya predefinidas dentro de librerías en el lenguaje, que permiten hacer uso de muchas utilidades que facilitan la labor de los programadores.

Sintaxis básica:

sub nombre
{
   cuerpo
}

Sin embargo, en PERL existe una diferencia con otros lenguajes de programación en el uso de subrutinas: el uso de parámetros y obtención del resultado. Las subrutinas no especifican argumentos en su definición. Entonces, ¿cómo hace PERL para especificar los parámetros facilitados a la función y devolver un resultado?. Hay que tener presentes las siguientes indicaciones:

  • Los parámetros de llamada a una subrutina se obtienen a través del array @_. (Cuyos elementos son $_[0], $[1], etc.).
  • Para devolver un resultado, hay que tener presente que el valor a devolver por una función es el resultado de la última sentencia que aparece dentro de su código. También se puede usar la sentencia “return expr” para devolver un valor antes del final de la subrutina.
  • Las variables que se usen dentro del código de la función son de ámbito global, por lo que, para evitar problemas por el alcance de dichas variables, se suelen definir variables de ámbito local, con el constructor local (variable).
  • La llamada a la función se efectúa anteponiendo al nombre el carácter ‘&‘.

Ejemplo:

//Definimos la función de conversión de pesetas a euros
sub convertir_a_euros
{
   local ($pesetas) = $_[0];
   return ($pesetas / 166.386);
}

$resultado = &convertir_a_euros (2500); #Llamamos a la función
print $resultado;

Uso de módulos y librerías

Existen numerosos módulos que incluyen funciones para facilitar ciertas operaciones a los programadores en PERL. Estos módulos integran funciones básicas para múltiples operaciones habituales para cada aspecto para el que han sido desarrolladas. Por ejemplo, PERL integra una librería CGI.pm que facilita el desarrollo de aplicativos CGI en PERL.

No vamos a ofrecer en este punto un resumen de los módulos estándar que puede encontrar en PERL, sino una referencia a cómo puede hacer uso de un módulo que pueda estar instalado, para aprovechar sus funcionalidades dentro del código de sus scripts. Si desea información sobre módulos disponibles puede acudir a la web de CPAN donde encontrará todo lo necesario.

Para poder hacer uso de un módulo, simplemente debe utilizar la sentencia ‘use’ cuyo cometido es importar el contenido de la librería, de modo que todas las variables y funciones que incorpore se puedan usar dentro del programa como si hubieran sido declaradas en el mismo.

Veamos el caso con un ejemplo sencillo:

#!/usr/bin/perl

#importamos el módulo CGI
use CGI;

#enviamos las cabeceras adecuadas
print header;

#enviamos las etiquetas HTML hasta BODY
print start_html;

#asignamos el título a la página a mostrar
print title ('Mi página web');

print "Hola mundo!";

#enviamos las etiquetas de finalización de BODY y HTML
print end_html;

Otras características

PERL es un lenguaje muy extenso, del que solo hemos tocado algunos puntos de forma muy superficial.

Uno de sus módulos, que apoyan el desarrollo de aplicativos web dinámicos, a parte del CGI, es el módulo de acceso a bases de datos: DBI. Dispone de información más específica sobre este módulo y ejemplos de acceso a las principales bases de datos utilizando el mismo, en el apartado de acceso a bases de datos con PERL .

Más información

En Internet podrá encontrar manuales más completos y bibliografía sobre este lenguaje de programación.

Le presentamos, para su comodidad, algunos enlaces de interés que pueden serle de utilidad:

PERL.com Sitio oficial de PERL en Internet.
PerlDoc.com Página oficial con documentación sobre este lenguaje.
PERL.org Directorio oficial de PERL, con enlaces a sus sitios principales.
CPAN.org Sitio oficial de la Red de archivos de PERL, con información sobre sus módulos.
Active State Web con aplicativo PERL para Windows.