Introducción a Perl

Es quizá uno de los lenguajes más entrañables de los surgidos en los últimos años.

Extensamente utilizado en Internet para la programación en el servidor de CGI combina rapidez de desarrollo y facilidad de mantenimiento, todo ello sin engañar con recetas mágicas.

Tipos de Datos
Operadores
Estructuras de Control
Patrones
Entrada y Salida
Funciones del Sistema
Acceso a Directorios
Subrutinas

Tipos de Datos

Los tipos de datos en Perl son: Escalares, Matrices Indexadas y Matrices Asociativas.

Identificadores
El tipo de una variable se determina anteponiendo un caracter especial al nombre de la variable:

$. Escalares
Pueden ser strings, númericos, booleanos, etc. según el contexto. Siendo el string vacio '' (null string) y el numerico cero equivalentes a falso, siendo cierto cualquier otro valor. Ejemplos:

Perl ademas de admitir que a un mismo escalar se le asignen tanto valores de cadena como numéricos tambien acepta números en forma de cadena, posibilidades:
$nivel = 10;
$nivel = 'diez';
$nivel = '10';
$nivel = '00010';

Otra particularidad es que podemos especificar las cadenas con comilla simple (no se interpretan las secuencias de escape como \n) o entre comillas dobles (si se interpretan los codigos de escape como tales).

Escalares Especiales
Los Escalares Especiales se denominan "con signos de puntuación" (excepto el $0): Matrices Indexadas (listas)
Nos referimos a un elemento de la matriz mediante con el prefijo de escalar, ejemplo: $miarray[ $i+3 ], nos referimos a todo la matriz medienta @, así podemos inicializar una matriz como sigue:

@miarray=(1,2,3,4,5,6); #Inicializar la matriz con valores.
@miarray=(); #Inicializar a vacio.
@miarray1=@miarray2; #Copiar una matriz.
@miarray=$otro[$i..$i+10]; #Copia diez valores de otra matriz.
@miarray=(1,2,3,4,5,6); #Inicializar el array con valores.
@miarray=(1,2,3,4,5,6); #Inicializar el array con valores.

$#nombrearray contiene el índice más alto de la matriz.

Matrices Asociativas (HASH)
Las matrices asociativas nos permiten referirnos a un elemento por una cadena en lugar de por un número. Nos referimos a un elemento de la matriz por $nombre{'cadena'} y para referirnos a toda la matriz mediante %. Ejemplos:

$pedidos{'empresa,s.a.'} +=1;
%servidos = %pedidos;

Matrices Especiales

Operadores

Perl usa todos los operadores de C (incluidos los unarios de tipo incremento, decremento, etc.), excepto el type-casting, $ y * para punteros. Contiene además: Operadores de archivos Como los de /bin/test. Son operadores unarios con el formato -operador cadena die "$archivo no es archivo de texto" unless -T $archivo;

Interpolación Perl iterpreta y sustituye las variables por su valor cuando están incluidas en una cadena delimitada con dobres comillas, pero no si aparecen con comillas simples (igual que con los códigos de escape). Así, las concatenaciones siguientes son equivalentes:
$a = 'Hola';
$b = 'mundo';
$res = $a . ' infame ' . $b;
$res = "$a infame $b";

Más sobre operadores Puedes encontrar información detallada de los operadores en la página de manual de perlop: man perlop

Estructuras de Control

Perl es un lenguaje estructurado, los bloques siempre van delimitados por { }.

Condicional if-else
if (EXPR) BLOQUE elseif (ESPR) BLOQUE else BLOQUE

Bucles while
Preevaluado:
while (EXPR) BLOQUE

o postevaluado:
do BLOQUE while EXPR

Bucles for
for (EXPR; EXPR; EXPR) BLOQUE
foreach $variable (LISTA) BLOQUE

redo
Vuelve a lanzar la iteración ignorando la condición de salida del bucle (si la tiene).

do until
do BLOQUE until (EXPR);

do rutina
Lanza la ejecución de una subrutina:
do rutina($a, $b);

do programa
Lanza la ejecución de un programa en el contexto actual.
do 'programa.pl';

return
Finaliza la ejecución del programa principal o de la subrutina en curso y devuelve un valor de retorno, que debe ser CIERTO en caso de terminar correctamente.
return $valor;

Patrones

Acepta egrep expresión, ampliandolo la notación de egrep en: Caracteres de Escape
Reconoce caracteres de escape de C como: \t, \n,\034.

Caracteres Especiales
( ) | { } +

Variables Especiales
Nombrado de Parámetros
Fuera de la expresión de egrep como variables: $1..$9 y dentro de la expresión nos referimos como \1..\9
if (/^este (rojo|azul|verde) (bat|pelota) es \1/) {
($color, $objeto) = ($1, $2);
} ($color, $objeto) =/^este (rojo|azul|verde) (bat|pelota) es \1/;

Operadores de Sustitución y Traslación
Como la "s" e "y" de sed:

s/alfa/beta/;
s/(.)\1/$1/g; y/A-Z/a-z/;

Buscar Variables
Mediante =~ y !~

if ($foo !~ /^\w+$/) {exit 1;} $foo = ~ s/\btexas\b/TX/i;

Entrada y Salida

Los canales de entrada/salida tienen sus propios identificadores: STDIN, STDOUT y STDERR.

Para leer la siguiente líne de un canal de entrada utilizamos los símbolos < y >, leyendose una linea si se almacena en un escalar y todas las líneas si se utiliza una matriz. Las lineas nuevas se dejan intactas.

$linea = < STDIN > @lineas = < STDIN >

< > se refiere a todos los archivos indicados en la línea de comandos o STDIN en caso de que no se indicase ninguno. El nombre del archivo actual lo tenemos en $ARGV.

Si se usa en un ciclo WHILE las lineas de entrada se asignan automáticamente a $_, se suele manejar archivos iterando la entrada y procesando una sola línea cada vez usando $_ como operando por defecto.

while (< >){
next if /^#/ ; #Salta comentarios s/nuevo/viejo/g; #Sustitución en todo el texto. print; #imprime $_
}

Abrir y Cerrar archivos
Mediente la instrucción open(nombre_canal,"archivo") abrimos el archivo indicado y queda asociado al canal (handle del archivo) cuyo nombre se especifica, típicamente:

open(PWD,"/etc/passwd"); open(TMP,">/tmp/temporal.$$"); open(LOG,">>historico"); open(APIPE,"| lpr"); open(DEPIPE,"/usr/etc/netstat -a |");

Como se puede observar en el nombre del archivo podemos incluir caracteres para indicar entrada, salida, redirección, etc.

# Abrir para lectura
open(DATOS, $file);
open(DATOS, "<$file");

# Abrir para escritura.
open(DATOS, ">$file");

# Abrir para añadir.
open(DATOS, ">>$file");

Tambien podemos abrir la entrada y salida estandar (teclado y pantalla de la siguiente forma:

open(ENTRADA, '-'); open(SALIDA, '>-');

Para cerrar el archivo se utiliza close(NOMBRE_CANAL);

Lectura y escritura de un canal
Mediente getc, read y < NOMBRE_CANAL>.

Podemos cargar todo el archivo en una matriz mediante:

@lines = <ENTRADA>;

Funciones de Archivos
eof, seek, close, flock, ioctl, fcntl y select se pueden suar con nombres de canales de E/S.

Las funciones mkdir, rmdir, chmod, chown, link, symlink, stat, rename y unlink se pueden usar con nombres de archivos.

printf admite un nombre de un canal abierto, usandose por defecto STDOUT. Las siguientes llamadas son equivalentes:

printf STDOUT "Hola $nombre" printf STDOUT "Hola %s",$nombre printf "Hola $nombre"

Se pueden enlazar matrices asociativas a archivos dbm mediante dbmopen().

Funciones del Sistema

Perl incluye muchas funciones de las librerías de C, incluyendo muchas de las llamadas al sistema. Entre estas se encuentran :

chdir chroot exec exit fork getlogin getpgrp getppid kill setpgrp setpriority sleep syscall system times umask wait

Si la red es de tipo Berkeley entonces también están disponibles :

bind connect send getsockname getsockopt recv getpeername listen socket socketpair getpw* getgr* gethost* getnet* getserv* getproto*

pack y unpack pueden ser usados para manipular datos binarios.

Acceso a Directorios

A través de /bin/ls mediante: open (FILES,"/bin/ls *.c |");

Mediante las funciones de tratamiento de directorios de Perl: opendir, readdir, closedir, seekdir, telldir, y rewinddir.

Mediante metacaracteres del sistema entre < y >

foreach $x ( <*.[ch]> ) { rename ($x, "$x.old"); } chmod 0644, <*.c>;

Subrutinas

Una subrutina o función puede ser ejecutada mediante do o mediante el símbolo & (para recoger el valor devuelto):

do funcion1($par1, @par2);
$x=&funcion2(@par2);

La definición de la función se realiza mediante sub nombreFuncion BLOQUE. Los parámetros son recibidos en @_ y pueden ser pasados a variables locales, lo cual es importante en el caso de funciones recursivas.

$resultado = &funcion($par1, $par2, $par3);
sub simple {
local($par1Local, @resto ) = @_;
local($tmp, %otros); #Declaraciones locales;
return $tmp;
}

© David Hernandez Tejada. TeleProgramadores.com 2000-01-01
Todos los derechos reservados. No está permitida la copia y/o distribución en ningún medio.
e-mail TeleProgramadores