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
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.
- @ Matriz Indexada.
- % Matriz Asociativa.
- & Funcion.
$. 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:
- $num_dec = 3.1416;
- $nombre = "pepe";
- $frase = "Hola $nombre"; #Variable interpolada.
- $host = `hostname`; #
- ($R, $G, $B) = ('rojo', 'verde', 'azul');
- ($A, $B) = ($B, $A); #SWAP o intercambio.
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):
- $0 Nombre del script.
- $_ Default para operadores de patrones y E/S implícita.
- $$ El PID actual.
- $! Mensaje de error actual del sistema (errno).
- $? Estado del último `backtick`, pipe o shell del sistema.
- $| Si la salida tiene buffer (se está usando una tubería desde el
sistema).
- $ Número de linea actual de la entrada.
- $[ Base de la matriz, por defecto es 0 (awk usa 1).
- $< El UID real del proceso.
- $( El GID real del proceso.
- $> El UID efectivo del proceso.
- $) El GID efectivo del proceso.
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
- @ARGV Argumentos pasados al script (desde la linea de comandos).
- @INC ´Camino de búsqueda o PATH para los archivos llamados con "do".
- @_ Valor por defecto para los parámetros de subrutinas y split.
- %ENV Matriz de variables del entorno actual. Como $ENV['HOME']
- %SIG Para señalar manejadores:
sub trapped {
print STDERR
"Interrupted\007\n";
exit 1;
}
$SIG{'INT'} =
'trapped';
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:
- **, **= Exponenciación
- .. Rango: (1..10), [1..10], etc.
- . , .= Concatenación de strings: $linea += "\n";
- x, x= Repetición de strings: $cadena='-' x 30; #treinta guiones.
- eq, en, lt, gt, le, ge Comparaciones de strings.
Operadores de
archivos Como los de /bin/test. Son operadores unarios con el formato
-operador cadena
- -e Si el archivo existe.
- -z Si tiene longitud cero.
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:
- \w, \W Suma alfanumerica, y negación.
- \d, \D Dígitos y negación.
- \s, \S Espacio en blanco y negación.
- \b, \B Límites de palabras y negación.
Caracteres de
Escape
Reconoce caracteres de escape de C como: \t, \n,\034.
Caracteres Especiales
( ) | { } +
Variables Especiales
- $& Todo el texto coincidente.
- $` Texto anterior al coincidente.
- $' Texto posterior al coincidente.
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