El lenguaje Perl

INTRODUCCION

Para crear formularios en la Web, necesitamos de un lenguaje de programación para procesar los datos que son enviados al servidor. Perl es una alternativa muy atractiva porque es un lenguaje especializado en buscar, extraer y presentar información.

Perl, principalmente, es un lenguaje para la manipulación de cadenas de datos y de archivos, y su diseño ignora la distribución en pantalla de botones, menús, listas de selección, y otros elementos propios de una interfaz, es decir, no es nada vistoso, aunque su especialización en el uso de modelos de búsqueda lo hace muy potente.

Perl es un intérprete que fue creado por Larry Wall y liberado al mundo para disfrute de cualquier persona. Larry cedió Perl de forma gratuita, estipulando como tal su uso, el acceso libre a los intérpretes, y a las mejoras de Perl. Y condicionó su utilización a que no se hiciera explotación comercial o de lucro.

Hay versiones de Perl para casi todas las plataformas que existen, y su uso está muy extendido en Internet, aunque no podemos olvidar que Perl nació en el entorno Unix como una herramienta auxiliar de rastreo de archivos y extracción de información, como su propio nombre indica.

El presente manual no pretende ser el típico manual extenso de referencia de un lenguaje, es más, no abarca a todo el lenguaje Perl, aunque sí lo más esencial. Su estructura presupone alguna experiencia en programación y está orientado a resolver con Perl la cuestión de los formularios de la Web, problema real para muchos iniciados en HTML.

Antes de continuar conviene conseguir e instalar un intérprete de Perl para probar los ejemplos.

"Existe un enlace misterioso entre los dedos y el cerebro, que graba y solidifica su circulo creciente de conocimiento si realiza por sí mismo el tecleado de los ejemplos" (Jerry Muelver).

1. PARAMETROS DE PERL

1.1. Conocer la versión del intérprete de Perl.

El parámetro -v hace que el intérprete muestre la versión del mismo.

C:\>PERL -v

Ejemplo:

This is perl, version 5.001

Unofficial patchlevel 1m.

Copyright 1987-1994, Larry Wall Win32 port Copyright (c) 1995 Microsoft Corporation. All rights reserved. Developed by hip communications inc., http://info.hip.com/info/

Perl for Win32 Build 108 Built Jun 28 1996@13:37:45 Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5.0 source kit.

1.2. Ejecución de scripts con Perl en la línea de comando.

C:\>PERL nombre.pl

Ejecuta el script o programa nombre.pl

C:\>PERL -e "print 'Hola';"

El parámetro -e ejecuta la expresión como un programa de una línea.

C:\>PERL -n -e "print if /expresión/;"

Ejecuta la expresión como un programa de bucle repetitivo. También, puede indicarse -ne en vez de -n -e.

Ejemplo: Tenemos el fichero SALUDO.TXT que contiene 4 líneas:

Hola, Mundo...

...Adios, Mundo.

Hola Mundo, otra vez.

Adios Mundo.

Para visualizar las líneas usando -ne, teclear:

C:\>PERL -ne "print" saludo.txt

(Hace lo mismo que la orden TYPE del DOS).

1.3. Programas en Perl.

Para programar en Perl puede usar cualquier editor de textos, aunque hay algunos hechos a medida como WinPerl. La extensión de los archivos creados será .pl

Ejemplo: "Hola mundo". (hola.pl)

Editar hola.pl e insertar una línea con:

print "Hola Mundo";

(Al finalizar cada línea es obligatorio escribir 'punto y coma').

Guardar y ejecutar tecleando:

C:\> PERL hola.pl

Resultado: Hola Mundo

2. MODELOS DE BUSQUEDA

2.1. Modelos básicos.

Mediante modelos de caracteres podemos explorar archivos y visualizar las ocurrencias de un determinado modelo.

Los modelos se expresan escribiéndolos entre dos barras: /expresión/

Vamos a probar directamente desde la línea de comando...

Ejemplo: Del archivo SALUDO.TXT queremos visualizar las líneas que contengan la palabra "Hola". Teclear:

C:\>PERL -ne "print if /Hola/;" saludo.txt

Resultado:

Hola, Mundo...

Hola Mundo, otra vez.

Ejemplo: Del archivo SALUDO.TXT queremos visualizar las líneas que contengan al menos un punto. Teclear:

C:\>perl -ne "print if /./;" saludo.txt

Resultado:

Hola, Mundo...

...Adios, Mundo.

Hola Mundo, otra vez.

Adios Mundo.

Otros ejemplos: el fichero AVERIAS.TXT nos servirá para utilizar nuevas formas de búsqueda y conocer parte de la potencia de Perl en este tema:

30-12-98 12:00 Antonio López OKI SGE No enciende aloki

30-12-98 12:15 María Sánchez OKI SGT No funciona bien msoki

30-12-98 13:13 Carlos Mena HP SGT No tiene tinta cmhp

30-12-98 13:16 Luis López HP SGE Atasca papel llhp

31-12-98 12:00 Luisa López FUJ SGE No enciende llfuj

31-12-98 12:15 Claudio Sánchez OKI FEDER Instalar Word csoki

31-12-98 14:13 Felipe León OCT SGT No tiene tinta floct

31-12-98 14:25 Gloria Roca FUJ FEDER Instalar Jupiter grfuj

01-01-99 11:00 Luis López HP SGE Atasca papel llhp

01-01-99 11:05 Miguel López HP SGE Atasca papel mlhp

- Extraer las averías de SGE y de SGT.

C:\perl>perl -ne "print if /SG./;" averias.txt

El punto que está después de la G actúa como un comodín Es más lógico poner /SG/ para los datos existentes.

- Extraer las averías de Luis López.

C:\perl>perl -ne "print if /Luis López/;" averias.txt

- Extraer todas las averias de la marca HP.

C:\perl>perl -ne "print if /HP/;" averias.txt

- Extraer todas las averias en que hubo atasco.

C:\perl>perl -ne "print if /ATASC/;" averias.txt

-Usando más comodines:

. = cualquiera excepto el carácter de línea nueva.

+ = uno o más del carácter anterior.

? = Ninguno o uno del carácter anterior.

* = Ninguno o más del carácter anterior.

^ = Busca la coincidencia sólo al comienzo de la línea.

$ = Busca la coincidencia sólo al final de la línea.

# = Esto no es ningún comodín. Se usa para comentarios, los precede.

Si anteponemos \ (barra invertida) a cualquier comodín nos referimos al carácter en concreto.

- Extraer todas las averías con una o más F.

C:\perl>perl -ne "print if /F+/;" averias.txt

Si prueba con f (minúscula) el resultado es distinto.

- Extraer todas las averías de los hermanos Luis y Luisa López.

C:\perl>perl -ne "print if /Luisa*/;" averias.txt

- Extraer todas las averías del día 30-12-98.

C:\perl>perl -ne "print if /30-12/;" averias.txt

- Extraer todas las averías con primera letra del nombre M y final de apellido z.

C:\perl>perl -ne "print if /M.*z/;" averias.txt

(En realidad busca todo lo que empiece por M seguido de uno o más caracteres y con una z como carácter final de la cadena).

- Extraer todas las averías que finalicen en hp.

C:\perl>perl -ne "print if /hp$/;" averias.txt

- Extraer todas las averías que se dieron los días 30 y 31 de diciembre.

C:\perl>perl -ne "print if /^3.-12/;" averias.txt

2.2. Modelos avanzados.

2.2.1. Modelo {Min, Max}.

Se usa para buscar expresiones que se repiten.

Ejemplos:

/N.{1,3}d.*/ # Navidad, Navideño, Nada, Nudo (entre 1 y 3)

/a.{2}r/ # amar, atar, asar (2 caracteres entre a y r).

/al.{5, }/ # altozano, alcantarilla, albaricoque (5 o más).

/(am){2, }.*/ # amamanta, amamantó (am repetido 2 veces o más)

2.2.2. Modelo de clase [aeiou].

Se usa para establecer un rango de caracteres permitidos.

/bar.[aeiou].*/ # barca, barquero, barcelonés, bares, abarcar

/c[ao]../ # cara, cosa, cata, cala, coto, cana, cono

/[0-9]/ # 0,1,2,3,4,5,6,7,8,9

/[A-Z][a-z]/ # Aa, Za, Jk, Lm ...

/[a-zA-Z]/ # a, A, B, J, Z ...

/[A-CJ-L2-5]/ # A, B, C, J, K, L, 2, 3, 4, 5

/[^a-c].*/ # diente, zoo (cualquiera que no empiece por a,b o c)

/SE-[^A-Za-z]{4}-[^0-9]?/ # SE-0001-C, SE-8887-BJ, SE-1100-DA

2.2.3. Modelo de alternativa / | /.

Se usa para indicar opciones alternativas en un módelo de búsqueda.

/No fu|Si ca/ # No fumo, Si canto, No futbol, Si carros

/chicos/chicas/ # llegaron chicos, van chicas, las chicas

/No (fum|ju).*ar/ # No fumigar, No fumar, No jurar, No jugar

2.2.4. Carácteres especiales para modelos.

^ El modelo comienza al principio de la cadena.

$ El modelo termina al final de la cadena.

\r Retroceso de carro, 13 decimal ASCII.

\n Alimentación de línea 10 decimal ASCII en UNIX. 13+10 en DOS

\t Tabulación, TAB, 9 decimal ASCII.

\f Alimentación de página, 12 decimal ASCII.

\d Dígitos. Equivale a [0-9].

\D No dígitos.

\w Alfanumérico [a-zA-Z0-9_] (incluida barra subrayado).

\W No alfanumérico.

\s Espacio en blanco (incluye espacio, \t, \r, \n, \f).

\S Negación de \s. \b Límite ini-fin de palabra; coincide con puntuación, \s o \w.

\B Negación de \b.

Ejemplos:

/^\d+\t/; # comienzo de cadena por uno o más digitos seguidos de tab.

/\D$/; # cualquier cadena que termine en algo que no sean números.

2.2.5. Otros modelos útiles.

2.2.5.1. Modelo =~.

Cambia el objetivo de búsqueda para un modelo.

Ejemplo (cambobje.pl):

# Cambio de objetivos

$_="El cielo es azul"; $objetivo0 = $_;

$objetivo1 = "La casa es blanca";

$objetivo2 = "El perro es grande";

print if /cielo/;

if ($objetivo0 =~/azul/) { print $objetivo0 };

if ($objetivo1 =~/casa/) { print $objetivo1 };

if ($objetivo2 =~/perro/) { print $objetivo2 };

2.2.5.2. Modelo //i.

Ignora diferencia de mayúsculas y minúsculas.

/menú/ # menú y nada más /menú/i # Menú, MENÚ, mENú, menú

2.2.5.3. Modelo s///.

Busca y reemplaza la primera expresión encontrada de una cadena.

Ejemplo (buscmode.pl):

$_="los coches son blancos y blancos";

s/blancos/rojos/;

print; #los coches son rojos y blancos

$_="ahh..ahh..chuss... ¡lo siento!";

s/^ah+/oohh/; #oohh..ahh.. ¡lo siento!

print;

2.2.5.4. Modelo s///g.

Busca y reemplaza toda las expresiones en una cadena.

$_="Navidad, Navidad, dulce Navidad";

s/Navidad/Mesa de camilla/g; print; #Mesa de camilla, Mesa de camilla, dulce Mesa de camilla

2.2.5.5. Modelo tr///.

Intercambia caracteres según la correspondencia de un patrón.

Ejemplo (traslaci.pl):

$_="ten cuidado con la carretera";

tr/aeiou/AEIOU/;

print; # tEn cUIdAdO cOn lA cArrEtErA"

$_="libros+de+ciencia";

tr/\+/ /;

print; #libros de ciencia

tr/ /\+/; print; #libros+de+ciencia

$_="codigo secreto: 0013273";

tr/[0-9]/[a-j]/;

print; #codigo secreto: aabdchd

2.2.5.6. Modelo (Subexpresión) $1 $2...

Se usa para buscar subexpresiones repetidas y permite acortar la escritura de los modelos.

/(expresión1) (expresión2...) $1 $2/;

/Tengo una y(ama) que y$1 se y$1/; #Tengo una yama que yama se llama

/(color)in $1ado/; #colorin colorado

/([A-Z][A-Z]).*$1/; #ABNAB, CC2CC, DD4766jjDD

Ejemplo usando búsqueda y sustitución (expres.pl):

# Subexpresión usada para buscar y reemplazar en una cadena:

$_="nombre edad lugar ";

s/([a-z]+)\s/campo_$1,/g; #campo_nombre,campo_edad,campo_lugar

print;

2.2.5.7. Modelo s///e.

Evalua expresiones y funciones Perl que forman parte de un modelo de búsqueda.

$_ = "banana"; s/an/1+2/e; print; #Imprime: b3ana

$_ = "banana"; s/an/1+2/eg; #Imprime: b33a (la 'g' hace una sustitución global)

$_ = "banana"; s/a/pack("C", hex(41))/eg #Imprime: bAnAnA

3. VARIABLES

3.1. Variables escalares $.

Cualquier nombre que comience con $ es una variable escalar, lo que significa que puede contener sólo un objeto, aunque este objeto puede ser también complejo. El signo = se usa para asignar el objeto a la variable. Los caracteres permitidos para un nombre son las letras, dígitos y el caracter de subrayado. Después de $ debe continuar al menos una letra. Las letras mayúsculas y minúsculas son diferenciadas en los nombres de variables.

Ejemplo:

$lenguaje = "Perl";

$LENGUAJE, $lenguaje y $LeNgUaJe son 3 variables distintas.

Otro ejemplo (holavar.pl):

$saludo = "Hola Mundo";

print $saludo;

$saludo = "Adios Mundo";

print $saludo;

$saludo = 100

print $saludo + 10;

Ejecutar para ver el resultado: HolaMundoAdiosMundo110

(¡Todo en una línea! ¡Qué feo queda!)

Vamos a arreglarlo añadiendo un salto de línea con \n al final de cada línea (holasal.pl).

$saludo = "Hola Mundo\n";

print $saludo;

$saludo = "Adios Mundo\n";

print $saludo;

$saludo = 100;

print $saludo + 10, "\n";

Observa el último print: en él se usa la coma para visualizar en una misma línea varios objetos de distinto tipo. Atento a esto porque es muy útil.

Otra cosa, $_ es una variable muy especial porque almacena siempre la última línea que se dio de entrada (ya lo veremos más adelante, tranquilo).

Por otro lado, ¿recuerdas los modelos? Sí, sí, efectivamente, como pensabas las variables también pueden almacenar modelos.

Ejemplo: $Variable = /^Canción triste de Hill Street/

3.2. Variables especiales.

$_ Almacena la línea completa que ha sido leido.

$` Almacena la parte situada a la izquierda de un modelo.

$' Almacena la parte situada a la derecha de un modelo.

$& Almacena la parte propia del modelo encontrado.

Ejemplo (varespe.pl):

# Variables especiales

$_ = "Me gustan los mazapanes y el anís";

/ mazapanes /;

print $`, "\n"; # "Me gustan los"

print $', "\n"; # "y el anís"

print $&, "\n"; # "mazapanes"

print $`.$&.$'; # Igual que $_

3.3. Variable de edición directa $^I.

Cuando a $^I se le asigna un valor como .bak o .000 el lenguaje activa la edición directa de los archivos que llegan al programa a través del operador <>. Es muy útil para buscar y sustituir cadenas dentro de un grupo de archivos. Estudia el siguiente ejemplo (edicdir.pl):

# Edición directa con Perl

# Busca y reemplaza todas las cadenas html por HTML

# Teclear: Perl edicdir.pl <unhtml.htm doshtml.htm

$^I = ".bak";

while (<>) {

s/html/HTML/g;

print;

}

# Si quieres probar otra vez teclea COPHTML.BAT

# Este fichero copia unhtml.hhh a unhtml.htm y doshtml.hhh a doshtml.htm

# reconstruyendo ambos htmls para una nueva ejecución.

4. MATRICES

4.1. Matrices @

Se definen con el símbolo @ como primer carácter para diferenciarlas de las variables escalares. Contienen listas de objetos que no tienen que ser del mismo tipo.

Ejemplos:

@frutas = ("manzana", "pera", "plátano")

@diameses = (31,28,31,30,31,30,31,31,30,31,30,31)

@detounpoco = ("manzana", 31, @frutas, $eltiempo)

Estudia el siguiente ejemplo (matrices.pl):

# Define la matriz @fruta con tres elementos

@fruta = ("manzana","pera","platano");

print @fruta[0]; # Muestra el primer elemento

print @fruta[1]; # Muestra el segundo elemento

print @fruta[2]; # Muestra el último elemento

# Agrega otra fruta al final de la lista

@fruta[3] = "Melón";

# Agrega otra fruta al final de la lista (de otra forma)

push(@fruta, "kiwi");

#¿Los vemos todos juntitos?

print "\n"; # Esto para insertar una línea nueva

print @fruta; # Y esto para verlos juntitos...

# Creamos una nueva tabla.

@dias= (1,2,3,4,5,6,7);

# Agregamos la tabla dias como último elemento de la de frutas ¡Es posible!

push(@fruta, @dias);

print "\n"; # Esto ya sabes para que es.

print @fruta; # ¿Y esto que hará? ¡Qué bárbaro!

print "\n"; # Ni te lo cuento para que sirve.

print "@fruta"; # ¡Es el colmo! Separa los elementos con un espacio

print "\n"; # ...ZZZZ.zzzz....

print @fruta[5,3]; # Esto visualiza 1Melón.

Las líneas anteriores se encuetran en (matrices.pl).

Un ejemplo trabajando con los elementos de una matriz (matrice2.pl):

# Trabajando con los elementos de una matriz.

@matriz = ("enero", "febrero", "marzo"); #Define @matriz con 3 meses.

$elementos = @matriz; #Lee el número total de elementos que es 3.

$ultimo = @#matriz; #Lee el número del último elemento que es 2.

print @matriz, "\n";

print $elementos, "\n";

print $ultimo, "\n";

4.2. Matrices asociativas.

Una matriz asociativa está indexada por cadenas en lugar de por números. Se utiliza % para definir el tipo de matriz asociativa y un elemento está indexado por el anterior formando ambos parejas del tipo indice=valor.

Un ejemplo sencillo con una matriz asociativa (matrasoc.pl):

%campos = ("nombre", "Ana", "calle", "Andalucia 1", "edad", "56");

$tunombrees = $campos{"nombre"}; #Es "ana"

$tucallees = $campos{"calle"}; #Es "Andalucia 1"

$tuedades = $campos{"edad"}; #Es "56"

$tutodoes = $tunombrees." de ".$tucallees." con ".$tuedades." años";

print $tutodoes; #Ana de Andalucia 1 con 56 años

$campos{"sexo"} = "mujer"; #Añade el campo sexo con el dato mujer

$tusexoes = $campos{"sexo"}; #Es "mujer"

$tutodoes = $tutodoes." y es ".$tusexoes;

print "\n";

print $tutodoes; #Ana de Andalucia 1 con 56 años y es mujer

Un ejemplo para pasar una matriz @ en una matriz %:

@articulos = ("X", "Martillo", "Y", "Alicates", "Z", "Tenazas")

%inventario = @articulos;

print $inventario{"X"}; # Martillo

print $inventario{"Y"}; # Alicates

print $inventario{"Z"}; # Tenazas

4.3. Foreach(), Keys() y Each().

Ejemplo usando foreach para recorrer los elementos de una matriz hasta el final, la función keys() para acceder a los índices de una matriz asociativa y también la función each() que se presenta como la forma más lógica de acceder a los índices y a los valores de una matriz asociativa (matrasc2.pl):

# Recorre e imprime una matriz @ con foreach.

@meses = ("I", "ene", "II", "feb", "III", "mar");

foreach (@meses) {

print; #Imprime: IeneIIfebIIImar

}

print "\n";

# Ahora dejando un espacio en blanco entre los elementos.

foreach $lee (@meses) {

print $lee, " "; #Imprime: I ene II feb III mar

}

print "\n";

# Ahora crea una matriz % de una matriz @.

%mensualidades = @meses;

# Ahora usa keys() para leer los elementos indices de una matriz %

# que los almacena en la matriz @indices. Luego los imprime.

@indices = keys(%mensualidades);

print "@indices"; #Imprime: I II III

print "\n";

# Otra forma de imprimir los indices pero usando foreach

foreach $lee (keys(%mensualidades)) {

print $lee, " ";

}

print "\n";

# Por último hacemos con la matriz % lo que hicimos con la @,

# es decir, recorrerla toda pero accediendo por índices con keys().

foreach $lee (keys(%mensualidades)) {

print $lee, " --> ", $mensualidades{$lee}, " ";

}

print "\n";

# Imprime I --> ene II --> feb III --> mar

# Podemos recorrer una matriz asociativa con un bucle while() y

# usando la función each(). Each lee cada pareja de una vez así:

while (($indice, $valor) = each(%mensualidades)) {

print $indice, "=", $valor, "\n";

}

# Imprime I=ene II=feb III=mar

4.4. Split().

Usar Split() para convertir cadenas en listas de datos.

# Un ejemplo de Split() para convertir cadenas en listas

$cadena= "empresa=Donuts&producto=Donettes&precio=100";

@tabla = split(/&/, $cadena); #Divide la cadena usando &

print $tabla[0], "\n"; #empresa=Donuts

print $tabla[1], "\n"; #producto=Donettes

print $tabla[2], "\n"; #precio=100

# Split con $_

$_ = "Mañana vienen los Reyes Magos";

print "\n";

@reyes = split;

foreach $lee (@reyes) {

print $lee, "__"; #Mañana__vienen__los__Reyes__Magos__

}

4.5. Join().

La función Join() agrupa todos los elementos de una matriz dentro de una cadena y conecta los elementos con un delimitador específico.

Ejemplo:

$Union = "=";

@Frutas = ("Paco", "Curro", "Francisco");

$cadena = join($Union, @Frutas);

Print $cadena; # cadena = "Paco=Curro=Francisco"

4.6. Hex() y Pack().

Hex() convierte un número en base 10 a base 16 y Pack() es un convertidor de tipos que ofrece varias opciones de conversión. La función Pack toma dos parámetros para realizarlo: una plantilla, o instrucción para el tipo de conversión a realizar, y una lista de números decimales para convertir. Estas dos funciones son muy útiles para convertir datos procedentes de formularios de Web. Todos los caracteres de control, de puntuación y signos llegan en formato hexadecimal al servidor y necesitan convertirse al formato ASCII.

Plantillas y Tipo de número

"c" Carácter con signo (más o menos) -127 a 127.

"C" Carácter sin signo desde 0 a 255 (Formato ASCII).

"i" Entero con signo desde -16383 a +16383.

"I" Entero son signo desde 0 a 32767.

Ejemplos:

$letra = pack("C", 65); #Convierte 65 en un carácter ASCII

print $letra; #Imprime la letra A

$letra = hex(41); #Convierte 41 en hex a 65 en decimal

print pack("C", $letra);#Imprime también la letra A

$crlf = pack("CC", hex("0D"), hex("0A")); #Salto de línea

print $crlf; #Salto de línea es igual que "\n"

4.7. Chop().

Concatena cadenas eliminando el carácter de nueva línea.

Perl ajusta la función chop para cada plataforma. En UNIX, la nueva línea es 10 ASCII (el \n de Perl); en Mac es 13 ASCII; y en DOS (y Windows), es 13 ASCII más 10 ASCII. Tanto si consta de uno o de dos caracteres, en cada caso, chop elimina el carácter o caracteres de nueva línea.

Ejemplo (chop.pl):

while (<STDIN>) {

chop($_);

$linea .= $_;

print $linea,"\n";

}

4.8. Index().

Busca la situación de una subcadena dentro de una cadena.

Sintaxis: index($Cadena, $Subcadena [,Desplazamiento])

$cadena es la cadena dónde se busca la $subcadena y Desplazamiento es opcionalmente el número de caracteres desde el inicio que se ignoran en la búsqueda.

Ejemplo:

$posicion = index("Las bicicletas son para el verano","bici");

print $posicion; # $posicion = 4

$posicion almacena el número de posición de comienzo de la subcadena dentro de la cadena, teniendo en cuenta que el primer caracter de la cadena es la posición cero. Si el resultado es -1 no se ha encontrado la subcadena.

4.9. Rindex().

Busca hacia atrás la situación de una subcadena dentro de una cadena.

Sintaxis: rindex($cadena, $subcadena [,Desplazamiento])

$cadena es la cadena dónde se busca la $subcadena y Desplazamiento es opcionalmente el número de caracteres desde el inicio que se ignoran en la búsqueda.

Ejemplo:

$posicion = rindex("Las bicicletas son para el verano","bici");

print $posicion; # $posicion = 4

4.10. Length().

Lenght() devuelve la longitud de una cadena.

Ejemplo:

$longitud = length("Las bicicletas");

print $longitud; # $longitud = 14

4.11. Substr().

Devuelve una subcadena extrayéndola de una cadena partiendo de una posición inicial y una longitud determinadas.

Sintaxis: $subcadena = substr($cadena, inicio [,longitud])

Ejemplo:

$subcadena = substr("Las bicicletas", 5, 4);

print $subcadena; # $subcadena = "bici"

4.12. Push(), Unshift(), Pop(), Shift() y Delete().

Push() Añade elementos al final de una matriz.

Unshift() Añade elementos al principio de una matriz desplazando

el resto de elementos una posición hacia atrás.

Pop() Elimina elementos al final de una matriz.

Shift() Elimina elementos al principio de una matriz desplazando

el resto de elementos una posición hacia delante.

Delete() Elimina elementos en una matriz asociativa.

Ejemplo (matrice3.pl):

# Agregar y eliminar elementos en una matriz

@matriz = ("uno", "dos", "tres"); #Define matriz con tres elementos

push(@matriz, "cuatro"); #Añade al final un cuarto elemento

print "@matriz", "\n"; #Visualiza uno dos tres cuatro

unshift(@matriz, "cero"); #Añade al principio el elemento "cero"

print "@matriz", "\n"; #Visualiza cero uno dos tres cuatro

$elemento = pop(@matriz); #Devuelve y elimina el último elemento

print $elemento, "\n"; #Visualiza cuatro

print "@matriz", "\n"; #Visualiza cero uno dos tres

$elemento = shift(@matriz); #Devuelve y elimina el primer elemento

print $elemento, "\n"; #Visualiza cero

print "@matriz", "\n"; #Visualiza uno dos tres

%romano = ("I","uno","II","dos"); #Crea la matriz asociativa romano

print %romano, "\n"; #Visualiza IunoIIdos

$borrar = delete $romano{"I"}; #Elimina la pareja Iuno

print $borrar, "\n"; #Visualiza uno

print %romano, "\n"; #Visualiza IIdos

4.13. Sort() y Reverse().

Sort ordena los elementos de una matriz.

Ejemplo (matrice4.pl):

@Matriz = ("d","a","c","b");

@Ordenada = Sort(@Matriz);

print "@Ordenada"; #Visualiza a b c d

Reverse invierte el orden de los elementos de una matriz.

Ejemplo:

@Matriz = ("a","b","c","d");

@Invertida = Reverse(@Matriz);

print "@Invertida"; #Visualiza d c b a

4.14. Values().

Visualiza los elementos valores de una matriz asociativa.

Ejemplo (values.pl):

%lenguajes = ( 1, "HTML", 2, "PERL", 3, "JAVA", 4, "JAVASCRIPT");

print values(%lenguajes), "\n"; #Visualiza HTMLPERLJAVAJAVASCRIPT

4.15. Die().

La función die() cuando se realiza una operación de acceso a un archivo, y ésta produce un error, termina inmediatamente la ejecución del programa y envía un mensaje de error a STDERR (la salida estándar para los errores). Es el último recurso que se tiene para informar de que algo ha ido mal.

Se suele usar conjuntamente con el operador especial or-else (o de lo contrario) que se representa con dos barras verticales ||. Delante de la primera barra se indica qué hacer y después de la segunda qué hacer en caso de no realizarse lo primero.

Ejemplo (die.pl):

open (FHANDLE, "saludo.txt") || die "No puedo abrir archivo";

open (FHANDLE, "saludi") || die "No puedo abrir saludi";

die ("Ya he terminado de trabajar.");

4.16. Grep().

Grep busca coincidencias de modelos en una matriz.

Sintaxis:

@encontrado = grep(/expresión/, matriz);

@encontrado contendrá la lista de coincidencias.

Ejemplo (grep.pl):

# Con la función grep() podemos buscar enlaces del tipo http://www...

# en una tabla.

@lista = ("Enlace 1: http://www.u.es ","texto","Enlace 2: http://www.d.es ");

# @enlaces almacena los elementos de @lista donde existe un enlace.

@enlaces = grep(/http:\/\/www\..* /i, @lista);

# Visualiza los elementos donde existe un enlace.

$numenlaces = @enlaces;

print "\n";

print "Número de enlaces: ", $numenlaces, "\n";

print "--------------------\n";

foreach $Encontrado (@enlaces) {

print "$Encontrado\n";

}

# Visualiza sólo los enlaces omitiendo el texto a derecha e izquerda.

print "\n";

print "Muestra sólo los enlaces:\n";

print "-------------------------\n";

foreach $_ (@lista) {

print $&."\n" if /http:\/\/www\..* /i;

}

5. OPERADORES, CONDICIONALES, BUCLES Y SUBRUTINAS

5.1. Operadores matemáticos.

+ Suma

- Resta

* Multiplicación

** Exponenciación

/ División (calcula cociente)

% División (calcula resto)

5.2. Asignación matemática.

+= Suma a la variable el valor que contiene más otro valor.

$var += 4 es igual que $var = $var + 4

-= Resta a la variable un valor al valor que contiene.

$var -= 4 es igual que $var = $var - 4

*= Multiplica a la variable el valor que contiene por otro valor.

$var *= 5 es igual que $var = $var * 4

**= Igual, pero con exponenciación.

/= Igual, pero con división.

%= Igual, pero con división (resto).

5.3. Operadores para cadenas.

. Concatena cadenas: "Feliz "."Navidad" = "Feliz Navidad"

.= $var = "hola "; $var.= " Perl"; $var = "Hola Perl"

x= Asigna una expresión un número de veces.

$var = "aahh!"; $var x=3; $var ="aahh!aahh!aahh!"

5.4. Operadores para comparar números.

> Mayor que

< Menor que

== Igual que

>= Mayor o igual que

<= Menor o igual que

!= Distinto que

<=> Devuelve -1 para izquierdo < derecho, 0 para iguales o 1

para izquierdo > derecho

5.5. Operadores booleanos.

&& AND

|| OR

! NOT

5.6. Operadores para comparar cadenas.

gt Mayor que

lt Menor que

eq Igual que

ge Mayor o igual que

le Menor o igual que

ne Distinto que

cmp Funciona igual que <=>

5.7. Salto: if-elsif-else.

Ejemplos:

print if ($a > 4);

if (condición) {

...si cumple condición ejecuta esta línea...;

...y también esta...;

}

if (condición) {

...si cumple condición ejecuta esta línea...;

...y también esta...;

} else {

...ejecuta si no cumple...;

}

if (condición_1) {

...ejecuta esta línea...;

} elsif (condición_2) {

...ejecuta esta línea si no cumple 1 y si 2...;

} else {

...ejecuta esta línea si no cumple 1 ni 2...;

}

5.8. Bucles: While() con last, next y (<>).

While (<STDIN>) Realiza el bucle mientrás estén entrando datos por STDIN.

While (<STDIN>) {

Print;

}

next Regresa al principio del bucle.

last Finaliza el bucle.

5.9. for().

Sintaxis: For($inicio; condición; paso) { instrucciones }.

Ejemplo:

For($inicio=1; $inicio <=10, $inicio++) { print $inicio }.

Dada la variable contador $inicio con 1 como valor inicial , se ejecutan una serie de instrucciones mientras se cumpla la condición ($inicio <=10) y cambiando el valor de $inicio en cada iteración (Incrementando $inicio en 1).

5.10. Funciones definidas por usuarios.

5.10.1. Creación de funciones.

Los usuarios de Perl disponen de muchas funciones como substr(), funciones que ya las proporciona el propio lenguaje, no obstante, es posible crear funciones propias que resuelvan determinadas tareas que no sean resueltas por las funciones existentes. Los nombres de las funciones de los usuarios se identifican rápidamente porque como primer carácter llevan el símbolo de ampersand (&).

El uso de funciones evita la redundancia en el código, de ahí que sea muy recomendable su uso. Además, el código de una función está aislado del flujo del programa, es decir, el flujo del programa pasa por alto los trozos de código de las funciones de los usuarios que sólo son ejecutadas cuando son llamadas. Esto también supone que pueden escribirse en cualquier parte de los programa, aunque normalmente suelen situarse al final de los mismos y ordenadas según algún criterio, por ejemplo alfabéticamente.

El formato de una función es el siguiente:

Sub NombreFunción {

...código...;

...código...;

[return VariableOExpresión]

}

5.10.2. Variables globales y locales. Return implicado.

Las variables de Perl son variables globales, es decir, si definimos una variable con un valor determinado y a continuación llamamos a una función donde se usa la variable, el valor sigue siendo el mismo. Y si dentro de la función la variable cambia de valor, al finalizar la ejecución de dicha función y al regresar para seguir el flujo del programa si de nuevo accedieramos otra vez a la variable el valor contenido será último dado.

La instrucción return devuelve el valor de la variable o expresión indicada a continuación. Return es opcional porque en Perl existe el return implicado, esto significa que si return es omitido la última asignación realizada dentro de la función será el valor devuelto de return.

Dentro de una función también podemos definir variables locales, es decir, variables que sólo mantienen su valor dentro de la función. Su existencia es compatible con otra variable con el mismo nombre fuera de la función cada una con sus valores y con vidas separadas. Para definir variables locales se usa la sentencia local seguida de las variables entre paréntesis y separadas por comas y deben definirse a continuación del nombre de la función. Así:

Sub NombreFunción {

local ($Variable1, $Variable2...)

...código...;

[return VariableOExpresión] }

A una función se le pueden pasar valores escribiéndolos entre paréntesis y separados por comas a continuación de la llamada a la misma.

Ejemplo:

&AreaTriangulo($base, $altura);

Dentro de una función con parámetros existe la matriz especial @_ que almacena los valores recibidos en la función siendo su primer elemento $_[0], el segundo $_[1] y así sucesivamente.

Una biblioteca o librería es un conjunto de funciones creadas por un programador de Perl. El acceso a un función que está en una bibliotecas se hace con la función require("nombrebiblioteca.pl"). El uso de bibliotecas de funciones evita a los programadores la reescritura de éstas y facilita la distribución de funciones de distintos propósitos.

Ejemplo (funcion1.pl):

# La expresión de $cadena se invierte con la función invertir.

$cadena = "La casa de la pradera es una serie de tv muy chachi";

print &invertir, "\n";

$cadena = "0123456789";

print &invertir, "\n";

# Ejemplo de función pasándole dos parámetros.

print &bdias("Federico","+"),"\n";

print &bdias("Federico"," "),"\n";

print &bdias("Federico","_"),"\n";

# Ejemplo de uso de una matriz de parámetros.

$base = 10;

$altura = 5;

print &areatriangulo($base, $altura), "\n";

require("libperl.pl");

$lado = 3;

print &areacuadrado($lado), "\n";

sub invertir{

$contador = length($cadena);

$inversa = "";

while ($contador >= 0){

$inversa.= substr($cadena, $contador, 1);

$contador--;

}

return $inversa;

}

sub bdias{

local ($saludo);

$saludo = "¡ "."Hola ".$_[0]." !";

$_ = $saludo;

s/ /$_[1]/g;

return $_;

}

sub areatriangulo{

($lbase, $laltura) = @_; # Lee los parámetros pasados a la función

$areatriangulo = $lbase * $laltura / 2;

}

Ejemplo de librería de funciones (libperl.pl):

#Libreria de funciones.

#Primera función

sub areacuadrado{

$areacuadrado = $_[0] ** 2;

return $areacuadrado;

}

#Segunda función...

#Tercera función...

1; #El valor 1 indica que la instalación de la biblioteca tiene éxito.

#Es el return de la función require().

6. ENTRADA Y SALIDA

6.1. STDIN, STDOUT y STDERR.

Perl necesita saber de dónde procede su información y a dónde debe enviarla. Estos canales con el mundo exterior se denominan manejadores de archivos (filehandles). Cuando se ejecuta Perl, su primer orden de actividad es asignar a los manejadores de los archivos los canales de comunicación para la entrada, la salida y la información sobre los errores. Estos tres manejadores de archivos, se crean automáticamente y tienen nombres reservados: STDIN, STDOUT y STDERR. STD significa estándar.

Los tres STD se usan con tanta frecuencia que Perl supone a menudo que existen y, por consiguiente, Perl no necesita que se mencionen explícitamente; en lugar de ello, Perl los crea y les asigna canales automáticamente.

Ejemplo:

Cuando ejecutamos Print "¡Maravilla!"; Perl supone que STDOUT es el monitor y por eso visualiza sin necesidad de indicar en ningún lugar STDOUT.

Print STDOUT "¡Maravilla!"; es igual que Print "¡Maravilla!";

Un ejemplo curioso con error (holaerr.pl):

# Forzamos un error omitiendo las comillas finales.

Print "Hola;

Produce el siguiente error: Can't find string terminator...line 3

(o algo similar según la versión de Perl que usemos).

Sabemos que con el simbolo > podemos redirigir una salida de pantalla a un archivo. Pero si tecleamos,

C:\>Perl holaerr.pl > error.txt

comprobaremos que error.txt no tiene nada, es decir, el error producido hace que Perl se detenga una vez que su mensaje aparece en pantalla (salida estándar). Después de esto no se hará nada más, ni siquiera el envio del mensaje a error.txt. Ahora hemos aprendido que la salida estándar de los errores STDERR es la pantalla.

6.2. Operadores de entrada < >.

Los símbolos <> representan la entrada o los operadores de lectura de Perl. Si STDIN se encuentra dentro de estos símbolos, el operador de lectura lee una línea cada vez desde ese manejador de archivo.

Ejemplo: $Nombre = <STDIN>;

Ejemplo (leearchi.pl):

#Al ejecutar este script, teclear unas palabras seguidas de enter y

#y repetir lo mismo una segunda vez. A medida que escribimos <STDIN>

#lee lo que tecleamos y al pulsar enter lo asigna a la variable $uno,

#Lo mismo ocurre le ocurre a $dos.

$uno = <STDIN>; #Lee una línea

$dos = <STDIN>; #Lee una más

print $uno.$dos; #Se concatenan las líneas usando un puntito.

Ejemplo de lectura controlando el flujo con While (leebucle.pl):

#While permite hacer un bucle para leer y escribir tantas líneas

#como queramos. La condición se escribe entre paréntensis y las

#líneas que hacen el bucle entre llaves. Para finalizar la entrada

#desde el teclado pulsar Control+Z.

#También es útil para leer archivos si lo usamos con el símbolo <

#como con C:\>Perl leebucle.pl <saludo.txt.

While (<STDIN>) {

print;

}

6.3. Lectura de un archivo de texto.

Veamos como se hace con un ejemplo que lee el archivo SALUDO.TXT (leeeste.pl):

#El archivo se abrirá con open y entre paréntesis indicaremos en

#primer lugar el nombre del FILEHANDLE (puede ser cualquiera pero en

#mayúsculas) y separado por una coma del nombre del archivo a leer.

# Abrir y leer el archivo SALUDO.TXT

open (FHANDLE, "SALUDO.TXT");

while (<FHANDLE>) {

print;

}

otra forma de hacerlo es:

open (FHANDLE, "SALUDO.TXT")

While ($linea, <FHANDLE>) {

print $linea;

}

6.4. Lectura de un archivo de texto usando @ARGV.

Un ejemplo que perfecciona lo anterior usando @ARGV (leeargu1.pl):

Perl lee argumentos de la línea de comandos y los pasa al script utilizando una variable de matrices especial llamada @ARGV.

Primero vamos a ver como se realiza está lectura de argumentos y luego mejoraremos el ejemplo anterior. El script siguiente lista los argumentos tecleados en la línea de comando.

# Lee argumentos de la línea de comando y los lista ordenadamente.

$NumArg = @ARGV; # NumArg almacena el número de argumentos

$Cuenta = 0;

while ($Cuenta < $NumArg) {

print "Argumento Núm. ", $Cuenta, " ---> ", $ARGV[$Cuenta], "\n";

$Cuenta++; # Incrementa en 1 la variable Cuenta

}

Para ejecutar teclear:

C:\>PERL leeargu1.pl Ya huele a Feria de Abril

Ejemplo (leeargu2.pl):

A continuación, vamos a realizar un script que lee de la línea de comandos dos argumentos: el primero es el nombre de un archivo y el segundo un modelo que usaremos para buscar y visualizar las ocurrencias encontradas en el archivo indicado.

$patron = $ARGV[1]; # $patron guarda el modelo o 2º argumento

open (FICHERO, $ARGV[0]); # Abre el archivo indicado como 1er. argum.

while (<FICHERO>) {

print if /$patron/;

}

Para probar teclear: C:\>PERL leeargu2.pl saludo.txt Adios

6.5. Lectura de un archivo con read().

La función read() lee un número de bytes de un archivo. Su sintaxis es:

read( FHANDLE, $Cadena, $LongitudALeer );

Ejemplo:

open (FHANDLE, "SALUDO.TXT");

$longitud = 30;

read (FHANDLE, $cadena, $longitud);

print $cadena, "\n";

6.6. Operaciones de entrada y salida en un archivo.

A continuación se muestra una lista con las operaciones de entrada y salida habituales para con los archivos.

Operación y Descripción

<STDIN>;

Lee una línea desde el teclado o un archivo redireccionado. $_ contiene la línea.

$linea = <STDIN>;

Lee una línea y la asigna a una variable escalar.

while (<STDIN>) {print;}

Lee y muestra líneas desde el teclado hasta pulsar Ctrl+Z o desde un archivo hasta encontrar el final del mismo.

while ($linea = <STDIN>)

Lee y asigna líneas a una variable escalar desde el teclado hasta pulsar Ctrl+Z o desde un archivo hasta encontrar el final del mismo.

while (<>) {print;}

Lee y muestra las líneas de una lista de nombres de archivos.

$archivo = $ARGV;

Si $ARGV es un nombre de archivo lo asigna a la variable escalar $archivo.

while (<"*.txt">) {print;}

Lee y muestra las líneas de todos los archivos con extensión .txt.

open(MANARC, "archivo.txt");

Abre archivo.txt y le asigna un manejador de archivo de nombre MANARC en modo lectura.

open(MANARC, "<archivo.txt");

Abre archivo.txt y le asigna un manejador de archivo de nombre MANARC en modo lectura.

open(MANARC,">archivo.txt");

Abre archivo.txt o lo crea si no existe en modo escritura.

open(MANARC,">>archivo.txt");

Abre archivo.txt o lo crea si no existe en modo escritura-adición.

$linea = <MANARC>;

Lee una línea de un archivo ya abierto.

@linea = <MANARC>;

Lee todas las líneas de un archivo y las almacena en la matriz @linea.

@linea = <>;

Lee todas las líneas de una lista de archivos dados como argumentos.

open(MANARC, "arc.txt") || die("Problemas para abrir");

Abre archivo.txt y le asigna un manejador de archivo de nombre MANARC en modo lectura. Si el archivo no existe u ocurre otro problema detiene el programa y muestra el mensaje "Problemas para abrir".

6.7. Operaciones avanzadas con archivos.

Operación y descripción

open(MANARC, "+>arc.txt");

Abre un archivo en modo lectura/escritura. Si el archivo no existe se creará.

open(MANARC, "+<arc.txt");

Abre un archivo en modo lectura/escritura. Si el archivo no existe dará error.

read(MANARC, $Datos, $Long);

Lee una cadena con la longitud de $Long desde la posición actual en un archivo abierto y la almacena en la variable $Datos.

seek(MANARC, $Posic, 0);

Coloca el puntero en el número de byte que indique $Posic contando desde el inicio. $Posic debe ser positivo o cero.

seek(MANARC, $Posic, 1);

Mueve el puntero el número de bytes que indique $Posic desde la posición actual.

seek(MANARC, $Posic, 2);

Coloca el puntero en el número de byte que indique $Posic contando desde el final. $Posic debe ser negativo o cero.

read(MANARC, $Dat, $L1,$L2);

Lee una cadena con la longitud de $L1 desde la posición actual en un archivo abierto y la almacena en la variable $Dat, pero teniendo en cuenta que $Dat ya tenía otra cadena de la cual se respeta los $L2 caracteres iniciales.

$PosicionActual = tell(MANARC);

Devuelve la posición actual del puntero.

6.8. Imprimir datos con sprintf().

Sprintf() a aplica formato a datos.

Sintaxis: Sprintf(plantilla, $expresión)

Ejemplos (sprintf.pl):

# Aplicando formato a datos con sprintf() y la plantilla %s (espacios).

$lenguaje = "Perl";

$longitud = 10;

$conformato = sprintf("%s", $lenguaje);

print $conformato,"\n"; # Imprime:Perl

$conformato = sprintf(">>%s<<", $lenguaje);

print $conformato,"\n"; # Imprine:>>Perl<<

$conformato = sprintf(">>%s <<", $lenguaje);

print $conformato,"\n"; # Imprime:>>Perl <<

$conformato = sprintf(">>%10s<<", $lenguaje);

print $conformato,"\n"; # Imprime:>> Perl<<

$conformato = sprintf(">>%-10s<<", $lenguaje);

print $conformato,"\n"; # Imprime:>>Perl <<

$conformato = sprintf(">>%-${longitud}s<<", $lenguaje);

print $conformato,"\n"; # Imprime:>>Perl <<

6.9. Imprimir datos con printf().

Printf() a diferencia de print cuando escribe datos lo hace aplicando un formato de la misma que sprintf().

Sintaxis: printf(plantilla, argumento1, argumento2, argumenton)

Plantilla - Descripción

%c - Carácter

%d - Número entero

%e - Punto flotante en notación científica

%f - Punto flotante en notación decimal

%g - Punto flotante en notación %e y %f

%s - Cadena

%x - Entero con formato hexadecimal (minúsculas)

%X - Entero con formato hexadecimal (mayúsculas)

6.10. Imprimir bloques de datos con print<<.

Print<< permite imprimir bloques de texto.

Sintaxis: print <<etiqueta;

Línea texto1;

Línea texto2;

Línea texton;

Etiqueta

Ejemplo (printet.pl):

print <<BLOQUE

<HTML>

<HEAD><TITLE>Titulo</TITLE></HEAD>

<BODY>Contenido de la web</BODY>

</HTML>

BLOQUE

6.11. Ejemplo con ficheros de datos.

Ejemplo (config.pl): Config.pl lee el archivo de configuración Programa.ini y lo válida. El contenido de Programa.ini es:

TipoInstalación=red

UnidadInstalación=C:

DirectorioInstalación=\PAQUETES\APLICACIONES\

ArchivoEjecutable=PROGRAMA.EXE

NúmeroUsuarios=3

ArchivoConfiguración=config.ini

Si la información es correcta crea el archivo config.ini.

open (FHANDLE,"PROGRAMA.INI") ||

Die ("Error: No existe el archivo programa.ini");

@Tabla = ();

while (<FHANDLE>) {

print $_;

s/\n//g;

@ParteCadena = split(/=/,$_);

push(@Tabla, $ParteCadena[0]);

push(@Tabla, $ParteCadena[1]);

}

close(FHANDLE);

%TablaAsoc = @Tabla;

$TI = $TablaAsoc{"TipoInstalación"};

$UI = $TablaAsoc{"UnidadInstalación"};

$DI = $TablaAsoc{"DirectorioInstalación"};

$AE = $TablaAsoc{"ArchivoEjecutable"};

$NU = $TablaAsoc{"NúmeroUsuarios"};

$AC = $TablaAsoc{"ArchivoConfiguración"};

print "\n";

$error = &ValTI($TI);

$error = &ValUI($UI);

$error = &ValDI($DI);

if ($error == 1) {

print "Error: programa.ini no es válido\n";

} else {

print "programa.ini es válido\n";

print $UI.$DI.$AE;

open(ARCHIVO, ">$AC") || die("No ha sido posible la creación de ".$AC);

print ARCHIVO "[Instalación]\n";

print ARCHIVO "AplicaciónInstaladaEn=".$UI.$DI.$AE."\n";

print ARCHIVO "UsuariosAplicación=".$NU."\n";

close(ARCHIVO);

}

# Funciones de usuario

sub ValTI{

if ($_[0]=~/^red|^mono/) {

print "Tipo Instalación Correcta ->".$_[0]."\n";

return 0;

} else {

print "Tipo Instalación Incorrecta ->".$_[0]."\n";

return 1;

}

}

sub ValUI{

if ($_[0]=~/^[a-zA-Z][:]/) {

print "Unidad Instalación Correcta ->".$_[0]."\n";

return 0;

} else {

print "Unidad Instalación Incorrecta ->".$_[0]."\n";

return 1;

}

}

../continúa/..

sub ValDI{

if ($_[0]=~/^\\.*/) {

print "Directorio Instalación Correcta ->".$_[0]."\n";

return 0;

} else {

print "Directorio Instalación Incorrecta ->".$_[0]."\n";

return 1;

}

}

7. CGI Y PERL

CGI es Common Gateway Interface (CGI, Interfaz de pasarela común) que es como la puerta de acceso que hay entre una página Web y el servidor de Internet donde la página reside. En adelante vamos a ver por qué Perl es importante en la programación CGI.

Sabemos que un explorador o navegador o browser realiza un importante trabajo en la presentación de una página web, dando formato a los textos, componiendo la página, visualizando los gráficos, los marcos, las tablas y además interpretando los clics del ratón.

Pero hay que tener en cuenta también el trabajo que se realiza en la parte del servidor, porque éste da respuesta en cada momento a las peticiones que realizan los propios browsers, por ejemplo, cuando piden una página nueva, hay que buscarla, prepararla y empaquetarla para su envío y finalmente enviarla a su destino.

Por otro lado, cuando un explorador desea algo más que otra página Web o un gráfico desde el servidor, la solicitud va al CGI para poder ser procesada. Por ejemplo, las solicitudes de búsqueda de texto, el procesamiento de datos, los informes de datos, y otros procesamientos de datos interactivos necesitan un manejo especial.

Los programas CGI realizan el procesamiento, la construcción de los archivos, y el acceso a las bases de datos para las solicitudes especiales.

HTML y Perl cruzan sus caminos a través del CGI. Las solicitudes de procesamiento fluyen desde los documentos HTML a través del CGI, donde los programas Perl reciben las solicitudes y manejan la información. La respuesta usual proporcionada por un programa CGI de Perl toma la forma de otra página HTML, que se construye frecuentemente sobre la marcha para cumplir las necesidades específicas del solicitante.

Los documentos HTML y los programas CGI para un sitio de la Web están localizados usualmente en el mismo servidor. Un ordenador puede tener un número de cuentas de sitios de la Web, cada una con su propio conjunto de directorios independientes en el servidor. Puesto que los programas CGI deben acceder algunas veces a los archivos del servidor y a otros recursos, es de la mayor prioridad para los administradores del sistema de la Web aplicar medidas de seguridad con reglas y procedimientos para la transferencia de los archivos y para la utilización de programas CGI.

8. PERL Y LOS FORMULARIOS

8.1. Funcionamiento de un formulario.

La idea básica detrás de un formulario es sencilla: pida información al visitante, obtenga la información, después haga algo con la información. La parte delicada de tratar con los formularios se maneja entre bastidores por el código de Perl.

¿Cómo van los datos de un formulario al servidor?.

Después de que el visitante rellene un formulario, el explorador envía los datos para ser procesados o almacenados. Típicamente, la corriente de los datos del formulario es alimentada en un programa que cambia todos los datos por un formato más legible. El programa de procesamiento puede ser un URL (Universal Resource Locator o Localizador Universal de Recursos) situado en cualquier parte de Internet.

El programa de procesamiento de los datos es usualmente un script de Perl, un script de Shell de UNIX, o un programa compilado residente en el servidor que maneja sus páginas Web.

Los datos procedentes de un formulario fluyen en una corriente que utiliza un formato especial llamado URL encoding (codificación URL). El término procede del hecho de que los datos tienen que ser transformados en un formato que pueda viajar por Internet, lo que originariamente quería decir texto ASCII puro y sencillo que parecía como la dirección típica de la página Web; letras y números, sin espacios, sin puntuaciones caprichosas, y sin hacer cosas raras con las fuentes.

¿Si en un formulario de Web tuvieramos un campo Comentario con el texto "Esta noche me voy a comer las uvas de la suerte" dividido en dos líneas, es decir, una por ejemplo con "Esta noche me voy a comer las uvas " y otra con "de la suerte", cómo se enviaría esta información?. Pues así:

Comentario=Esta+noche+me+voy+a+comer+las+uvas+%OD%OAde+la+suerte

Observa los espacios (se sustituyen por signos más) y el salto de línea (en Ascii se hace con los caracteres 13 y 10 pero en Internet se expresa en hexadecimal con el signo de porcentaje "%" como prefijo). Es fácil. Pues aún hay más: si nuestro formulario tuviera dos campos para unirlos se usa el signo & de esta forma:

campo1=Feliz+Navidad&campo2=1998

Desde luego, codificar los datos es solamente la mitad de la batalla, traducir el URL, los datos codificados en texto legible en el otro lado de la trasnmisión es la otra mitad, y una buena tarea de Perl.

Cada campo tiene un atributo NAME (nombre, de forma que puede saberse de dónde proceden los datos) y un atributo VALUE (valor, contenido del campo). La cadena enviada por el explorador empareja cada NAME del formulario con su VALUE y los conecta con un signo igual: NAME=VALUE. La pareja NAME/VALUE es la construcción básica de datos de los formularios y de los programas de procesamiento de formularios. Los informes CGI más sencillos están realizados con listas de parejas NAME/VALUE.

8.2. Métodos de envío: GET y POST.

El visitante envía al servidor los datos del formulario utilizando uno de los dos métodos: GET o POST.

Con el método GET, el explorador empaqueta los datos del formulario en algo llamado URL encoding (codificación URL) y los agrega al final de una solicitud de aspecto normal para un URL. Por ejemplo, supongamos que en WWW.arrakis.es en el directorio /cgi-bin tenemos el programa Perl de búsqueda (busca.pl) y que nuestro formulario tiene un campo llamado Buscar con el valor "Blas Infante", al hacer clic sobre el botón Entregar (Submit) se enviará lo siguiente:

www.arrakis.es/cgi-bin/busca.pl?buscar=Blas+Infante

Si embargo, el método POST codificará los datos de la misma forma, pero los envía directamente al programa CGI a través de STDIN. El método POST usa la variable de entorno CONTENT_LENGHT (longitud del contenido) para decirle al servidor cuántos bytes debe leer desde STDIN. La corriente de datos puede ser tan larga como se necesite, cosa que no ocurre con el método GET que dependiendo del servidor se permitirán cadenas más o menos cortas. Está limitación hace que POST sea el método más utilizado.

8.3. Variables de entorno (CGI).

Las funciones y los procesos de un servidor pasan datos entre sí a través de variables de entorno. Estas variables actúan de forma muy parecida a la de una fila de buzones de correo. Los procesos y las funciones pasan información a esas variables y después vuelven a otra parte a realizar su tarea.

Las variables CGI de mayor importancia generalmente para comprender el proceso de comunicación explorador/servidor se describen en la tabla siguiente:

QUERY_STRING - Datos de entrada que se agregan a URL para un

método GET.

REQUEST_METHOD - Expresa el método usado: GET o POST.

CONTENT_LENGHT - Número de bytes de la corriente de datos a leer

para una solicitud con el método POST.

8.4. Más sobre formularios HTML.

<FORM>...</FORM>.Define el comienzo y final de un formulario.

ACTION="URL". Es el nombre del archivo del script o del programa que manejará los datos desde un formulario.

METHOD="GET" o "POST". Así se indica cómo se mueven los datos desde el formulario hasta el script que los maneja.

Ejemplo: <FORM ACTION="cgi-bin/formecho.pl/" METHOD="POST">

8.4.1. Elementos de un formulario.

<INPUT> Define campos de un formulario. Tiene un atributo NAME para asignar un nombre al campo y un atributo TYPE para definir el tipo de entrada del campo:

TYPE="TEXT" Texto.

TYPE="PASSWORD" Contraseña.

TYPE="CHECKBOX" Casilla de verificación.

TYPE="RADIO" Botón de opción.

TYPE="SUBMIT" Botón de envío de datos.

TYPE="RESET" Botón de borrado de formulario.

TYPE="HIDDEN" Campo oculto.

Otros atributos de INPUT son:

VALUE="Valor" Con las casillas de verificación y los botones de

opción especifica la opción seleccionada. En el

botón SUBMIT personaliza la etiqueta del botón.

SIZE="Tamaño" Longitud en caracteres del cuadro de entrada para

los tipos TEXT y PASSWORD.

MAXLEGHT="Tamaño" Longitud en caracteres máxima del campo para los

tipos TEXT y PASSWORD.

<SELECT></SELECT> Define una lista de elementos para selección.

NAME="Nombre" Nombre del campo.

SIZE="1,2" 1=Cuadro emergente 2=Cuadro desplazable >2=Cuadro

desplazable con entrada en blanco.

MULTIPLE Permite seleccionar más de una opción al

mismo tiempo.

<OPTION> Etiqueta para identificar el texto de un

elemento de una lista de opciones.

<OPTION SELECTED> Opción por defecto.

<TEXTAREA></TEXTAREA> Define un cuadro de texto de varias líneas.

NAME="Nombre" Nombre del campo.

ROWS="Filas" Número de filas.

COLS="Columnas" Número de columnas.

8.4.2. Ejemplo de formulario.

<HTML>

<HEAD>

<TITLE>Incidencias de los usuarios de PCs.</TITLE>

<BODY BGCOLOR="#75E5F0" TEXT="#000000">

<H1>Incidencias de los usuarios de PCs.</H1>

<H3>Si tiene problemas o necesita de los servicios del departamento</H3><P>

<H3>de micro rellene y envie este formulario.</H3>

<FORM ACTION="http://www.some.site/cgi-bin/avisos.pl" METHOD="GET">

<PRE>

<INPUT TYPE="HIDDEN" NAME="AAFormID" VALUE="Avisos">

Nombre: <INPUT TYPE="TEXT" NAME="Nombre" SIZE="20" MAXLEGHT="20"><P>

Centro Directivo: <SELECT NAME="Centro" SIZE="0">

<OPTION VALUE="Gabinete Consejera"> Gabinete Consejera

<OPTION VALUE="Viceconsejeria"> Viceconsejeria

<OPTION VALUE="S.G.T."> S.G.T.

<OPTION VALUE="S.G.E."> S.G.E.

<OPTION VALUE="Presupuestos"> Presupuestos

<OPTION VALUE="Patrimonio"> Patrimonio

<OPTION VALUE="Intervencion General"> Intervencion General

<OPTION VALUE="Tesoreria"> Tesoreria

<OPTION VALUE="Fondos Europeos"> Fondos Europeos

<OPTION VALUE="Tributos"> Tributos

<OPTION VALUE="Relaciones financieras"> Relaciones Financieras

<OPTION VALUE="Informatica"> Informatica

<OPTION VALUE="Otro departamento"> Otro departamento

</SELECT><P>

Telefono: <INPUT TYPE="TEXT" NAME="Telefono" SIZE="5" MAXLEGHT="5"><P>

Incidencia: <INPUT TYPE="RADIO" NAME="Tipo" VALUE="Averia" CHECKED> Averia

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Programa"> Programa

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Configuracion"> Configuracion

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Informacion" > Informacion

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Otro" > Otros<P>

Descripcion: <INPUT TYPE="TEXT" NAME="Incidencia" SIZE="40" MAXLEGHT="40"><P>

<INPUT TYPE="SUBMIT" VALUE="Enviar al Servicio de Informatica">

<INPUT TYPE="RESET" VALUE="Borrar">

</PRE>

</FORM>

</BODY>

</HTML>

8.4.3. Ejemplo de un analizador de cadenas codificadas URL.

Suponiendo que en el formulario anterior hubieramos tecleado los siguientes datos:

Nombre = "Manuel"

Centro = "Informatica"

Telefono ="64022"

Tipo = "Averia"

Incidencia = "No arranca PC"

la cadena URL que se enviará al servidor después de pulsar sobre el botón "Enviar al servicio de informática" será:

?AAFormID=Avisos&Nombre=Manuel&Centro=Informatica&Telefono=64022

&Tipo=Averia&Incidencia=No%20arranca%20PC

Con este envío y ayudados de un programa en Perl podemos analizar la cadena URL y crear un formulario que nos presente los datos de una forma más inteligible, por ejemplo en HTML para ser visualizado por un navegador (formula1.pl):

# Analizador de cadenas codificadas URL

# Ejecutar perl formula1.pl formula1.txt >formula2.htm

print "<HTML>\n<HEAD><TITLE>Form Data</TITLE></HEAD>\n";

print "<BODY>\n<H3>Form Data</H3>\n";

while (<>) {

if (/AAFormID=/) {

chop();

@url = split(/&/);

foreach (@url) {

tr/+/ /;

s/=/ = /;

s/%(..)/pack("C",hex($1))/ge;

print "$_<BR>\n";

}

print "<P><HR>\n";

}

}

print "</BODY>\n</HTML>\n";

close;

# Si no entiendes parte de este código estudia el capítulo de los

# modelos de búsqueda.

8.4.4. MIME y Perl.

MIME, Multipurpose Internet Mail Extensions (Extensiones del correo de internet para aplicaciones diversas) son especificaciones para los tipos de archivos que se mueven por Internet. La finalidad de MIME es permitir a los ordenadores de las diversas plataformas y a las configuraciones pasa información entre sí y que comprendan cómo procesar la información con la menor cantidad de confusión y molestia. Existen distintos tipos de MIME para textos, imágenes, vídeo, audio, mensajes, aplicaciones y otras más.

HTML es texto, y su tipo MIME es text/html.

¿Cómo se apoyan los servidores en MIME?.

Después de recibir una solicitud para enviar un archivo, el servidor comprueba la extensión del archivo para determinar el tipo MIME del archivo. Extensiones como .HTM, .HTML, .GIF, .JPG, .MID y otras más son conocidas en el ámbito de Internet y es importante saber que no se pueden cambiar arbitrariamente estas extensiones por otras inventadas. La razón de que tenga esa limitación es que el servidor confia en la utilización esperada de las extensiones para determinar el tipo de archivo.

8.5. Las cabeceras HTTP.

Los archivos deben estar "bien vestidos" con el fin de que puedan moverse por Internet. Todas las solicitudes desde un explorador a un servidor y, a la inversa, todos los archivos o respuesta en forma parecida a un archivo desde un servidor al explorador, tienen una parte de identificación de los datos llamada cabecera pegada delante (a la cabeza) del archivo.

8.5.1. Cabeceras de solicitud.

La primera pieza de la información que envía el explorador al servidor como parte de la solicitud es una cabecera de solicitud Method. Esta cabecera consiste en sólo una línea de texto que contiene tres elementos en un formato especial y separados por un espacio.

Method URL Versión

Method es el método usado en la etiqueta <FORM> del HTML: POST o GET.

URL especifica la situación o dirección del documento solicitado.

Versión es el nivel más alto del protocolo HTTP que entiende el explorador.

Ejemplo: GET http://www.cancana.es/index.html HTTP 1.0

Con esta cabecera, el servidor ya sabe lo que tiene qué hacer, aunque después de esta cabecera pueden ir otras adicionales para proporcionar más información al servidor o para solicitar un trabajo especial del mismo.

Luego, cuando responde el servidor a un usuario de la WWW también agrega cabeceras de respuesta delante de los archivos que le envía, cediendo el turno al navegador en la interpretación y ejecución de las mismas.

Los programas CGI no tratan directamente con las cabeceras de solicitud que proceden del explorador. El servidor incorpora la información de la cabecera en las variables CGI y un programa CGI (un programa en Perl) comprueba el contenido de la variable para buscar los datos.

8.5.2. Cabeceras de respuesta.

El servidor utiliza cabeceras de respuesta para comunicarle al explorador las particularidades sobre el archivo entrante: su tipo, su longitud, los datos modificados últimamente y así sucesivamente.

Los programas CGI son archivos, pero no se envían sino que se ejecutan en el servidor. Los programas CGI devuelven típicamente información al explorador enviando un archivo o produciendo una serie de comandos print, que le parecen un archivo al explorador, a STDOUT.

Con el fin de hacerle fluir a través de Internet hasta el explorador, el archivo necesita una cabecera. Debido a la forma en que trabaja el CGI, el programa tiene que crear su propia cabecera de respuesta para devolver un mensaje al explorador.

Para una respuesta en el formato de página HTML la cabecera será:

Content-type: text/html

Y para una respuesta usando un simple mensaje de texto:

Content-type: text/plain

Después de una cabecera de respuesta hay que añadir una línea en blanco. Con Perl se hará:

Print "Content-type: text/html\n\n"; # ¡ Con dos "\n" seguidos !

Print "<HTML><HEAD><TITLE>Título de la página</TITLE></HEAD>\n";

Print "<BODY>Contenido de la página</BODY></HTML>\n";

8.6. Perl y Unix.

Los pasos para ejecutar Perl en un servidor Unix son:

1º. Insertar un mensaje dentro del script para indicarle a UNIX donde debe encontrar el intérprete de Perl que ejecuta el script. Debe estar en la primera línea del archivo.

Ejemplo: #!/usr/local/bin/perl

2º. Convierta el script Perl en texto UNIX. En UNIX las líneas terminan con el carácter de alimentación de línea (10 ASCII, llamado LF). En DOS, el símbolo de terminación es el de retroceso de carro (CR) + alimentación de línea (LF), es decir, (13 ASCII + 10 ASCII).

Con los programas FTP la conversión suele realizarse de forma automática pero puede hacerla también con el siguiente programa en Perl:

Ejemplo (crlftolf.pl):

# Para ejecutar teclear: PERL crlftolf.pl <dos.pl> unix.pl

binmode(STDOUT);

while (<STDIN>) {

chop;

print "$_\n";

}

3º. Transferir el script al directorio designado por el Proveedor de Servicios Internet (PSI) para sus programas CGI.

4º. Cambie la propiedad del modo de operar del script de forma que UNIX sepa que el script puede ejecutarse directamente.

Teclear:

chmod 755 script.pl (Para conceder permiso de ejecución a scripts)

chmod 766 directorio (Para conceder permiso de L/E a un directorio)

5º. Cambie a continuación los derechos de acceso para el script para que permita a sus visitantes en la web que ejecuten el script como un programa CGI.

8.7. Ejemplo Completo: Formulario, Perl, Instalación y Ejecución.

En el ejemplo siguiente vamos a crear un formulario HTML y un script que lee los datos del formulario, devuelve un mensaje informando de su recepción y envía los datos vía correo electrónico a la cuenta incidencias@ceh.junta-andalucia.es:

1º. Crear el formulario siguiente (incidenc.htm):

Código HTML de incidenc.htm:

<HTML>

<HEAD>

<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">

<TITLE>Incidencias de los usuarios de PCs.</TITLE>

<BODY>

<H1>Incidencias de los usuarios de PCs.</H1>

<H3>Si tiene problemas o necesita de los servicios del departamento</H3><P>

<H3>de micro rellene y envie este formulario.</H3>

<FORM ACTION="//sello00/cgi-bin/avisos.pl" METHOD="POST">

<PRE>

<INPUT TYPE="HIDDEN" NAME="AAFormID" VALUE="Avisos">

Nombre: <INPUT TYPE="TEXT" NAME="Nombre" SIZE="20" MAXLEGHT="20"><P>

Centro Directivo: <SELECT NAME="Centro" SIZE="0">

<OPTION VALUE="Gabinete Consejera"> Gabinete Consejera

<OPTION VALUE="Viceconsejeria"> Viceconsejeria

<OPTION VALUE="S.G.T."> S.G.T.

<OPTION VALUE="S.G.E."> S.G.E.

<OPTION VALUE="Presupuestos"> Presupuestos

<OPTION VALUE="Patrimonio"> Patrimonio

<OPTION VALUE="Intervencion General"> Intervencion General

<OPTION VALUE="Tesoreria"> Tesoreria

<OPTION VALUE="Fondos Europeos"> Fondos Europeos

<OPTION VALUE="Tributos"> Tributos

<OPTION VALUE="Relaciones financieras"> Relaciones Financieras

<OPTION VALUE="Informatica"> Informatica

<OPTION VALUE="Otro departamento"> Otro departamento

</SELECT><P>

Telefono: <INPUT TYPE="TEXT" NAME="Telefono" SIZE="5" MAXLEGHT="5"><P>

Incidencia: <INPUT TYPE="RADIO" NAME="Tipo" VALUE="Averia" CHECKED> Averia

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Programa"> Instalacion programa

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Configuracion"> Configuracion

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Informacion" > Informacion

<INPUT TYPE="RADIO" NAME="Tipo" VALUE="Otro" > Otros<P>

N. Inventario: <INPUT TYPE="TEXT" NAME="Inventario" SIZE="5" MAXLEGHT="5"><P>

Descripcion: <TEXTAREA NAME="Descripcion" ROWS="2" COLS="50"></TEXTAREA><P>

</PRE>

<INPUT TYPE="SUBMIT" VALUE="Enviar al Servicio de Informatica">

<INPUT TYPE="RESET" VALUE="Borrar">

</FORM>

</BODY></HTML>

2º. Crear el script (avisos.pl):

#!/usr/local/bin/perl

# avisos.pl -- Devuelve datos via email

$email = "asuarez\@ceh.junta-andalucia.es";

read(STDIN, $formdat, $ENV{'CONTENT_LENGTH'});

open(MAILOUT, "| mail -s \"Incidencias de usuarios para micro\" $email") ||

die "No puedo ejecutar programa de correo.";

@namevals = split(/&/,$formdat);

foreach (@namevals) {

tr/+/ /;

s/=/ = /;

s/%(..)/pack("C",hex($1))/ge;

print MAILOUT "$_\n";

}

close(MAILOUT);

print "Content-type: text/html\n\n";

print "<HTML><HEAD>\n";

print "<TITLE>Servicio de Informatica: Recepcion de incidencias</TITLE>\n";

print "</HEAD><BODY>\n";

print "<H3>Datos de la incidencia recibida</H3>\n";

print "<HR>\n";

print "Sus datos han sido recibidos correctamente. Gracias por su colaboracion.<BR>\n";

print "<P><HR>\n";

print "</BODY>\n</HTML>\n";

8.8. Ejemplos: Datos de formularios y ficheros secuenciales.

Ejemplo (formula2.pl):

# formula2.pl: Lee cadena URL, genera html y almacena en archivo plano.

# Ejecutar perl formula2.pl formula1.txt >formula3.htm

print "<HTML>\n<HEAD><TITLE>Form Data</TITLE></HEAD>\n";

print "<BODY>\n<H3>Form Data</H3>\n";

open (DATOS, ">>formula2.dat");

while (<>) {

if (/AAFormID=/) {

chop();

@url = split(/&/);

foreach (@url) {

tr/+/ /;

s/=/ = /;

s/%(..)/pack("C",hex($1))/ge;

print DATOS $_, "\n";

print "$_<BR>\n";

}

print "<P><HR>\n";

}

}

print "</BODY>\n</HTML>\n";

close;

#fin

Ejemplo (formula3.pl):

# formula3.pl: Lee cadena URL, genera html y almacena en archivo plano.

# Los campos son separados por comas y delimitados por comillas.

# Ejecutar perl formula3.pl formula1.txt >formula3.htm

print "<HTML>\n<HEAD><TITLE>Datos del formulario</TITLE></HEAD>\n";

print "<BODY>\n<H3>Datos del formulario</H3>\n";

open (DATOS, ">>formula3.dat");

$comillas = pack(C,34);

$primeravez = 0;

$cadena = "";

while (<>) {

if (/AAFormID=/) {

chop();

@url = split(/&/);

foreach (@url) {

tr/+/ /;

s/%(..)/pack("C",hex($1))/ge;

/=/;

if ($primeravez==0) {

$cadena = $comillas.$'.$comillas;

$primeravez = 1;

} else {

$cadena = $cadena.",".$comillas.$'.$comillas;

}

}

print $cadena."\n";

print DATOS $cadena."\n";

print "<P><HR>\n";

}

}

print "</BODY>\n</HTML>\n";

close;

#fin

9. PAGINAS DINAMICAS

9.1. Introducción.

Son páginas que cambian su contenido, es decir, páginas que contienen partes vivas que hacen que se vean diferentes consiguiendo así suprimir la sensación de familiaridad. Es importante para una página atraer visitantes y una forma de conseguirlo es evitando que los usuarios siempre vean la misma información.

Una página tipica son las de respuestas a los formularios. Es posible crear un script que interprete la información recibida de un formulario y hacer que genere otra página resultado donde se hagan muestren cálculos o simples mensajes informativos que cambien en función de los datos de entrada.

9.2. Server-Side Includes.

Server-Side Includes son comandos HTML que funcionan como macros. Estos comandos son comentarios HTML con formato especial que recoge el servidor y utiliza como instrucciones para insertar información en el script HTML, en lugar de comentarios.

El formato usado es:

<!--#comando SSI-->

Ejemplo: <P>La fecha actual es: <!--#ECHO VAR="DATE_LOCAL"-->

Muestra la fecha actual de ejecución de una página.

El uso de estos comandos es una opción de los servidores que ejecutan el software HTML de NCSA. Para poder trabajar con estos comandos los servidores necesitan una configuración especial. También, a los documentos que contienen comandos SSI se les suele cambiar la extensión por .shtml para ser ejecutados de una forma especial. Un archivo .html se enviará inmediatamente, en cambio uno con comandos SSI, necesita generar un nuevo código a enviar donde aparezcan resueltos los comandos SSI. Esto conlleva una perdida de tiempo por lo que el uso de dichos comandos debe medirse para no hacer sufrir a los servidores.

9.3. Comandos SSI.

La tabla siguiente muestra los comandos SSI más usados:

Comando - Sintaxis/Descripción - Include

Include

<!--#INCLUDE FILE="/rutarelativa/archivo.html"-->

Inserta un archivo .html del directorio actual.

Config

<!--#INCLUDE VIRTUAL="/rutaabsoluta/archivo.html"-->

Inserta un archivo .html del directorio absoluto.

<!--#CONFIG SIZEFMT="BYTES"-->

Establece en bytes el formato de inserción de tamaño del archivo.

<!--#CONFIG SIZEFMT="ABBREV"-->

Establece en Kbytes el formato de inserción de tamaño del archivo.

<!--#CONFIG TIMEFMT="PlantillaFechaHora"-->

Establece el formato de inserción de la fecha y de la hora según una plantilla.

Echo

<!--#ECHO VAR="DATE_GMY"-->

Inserta hora del meridiano de Greenwich.

<!--#ECHO VAR="DATE_LOCAL"-->

Inserta fecha y hora local en el formato local.

<!--#ECHO VAR="LAST_MODIFIED"-->

Inserta fecha y hora de última modificación del archivo.

<!--#ECHO VAR="DOCUMENT_URI"-->

Inserta nombre y ruta del archivo principal local.

Flastmod

<!--#FLASTMOD FILE="/rutarelativa/archivo.html"-->

Inserta fecha de última modificación de un archivo de la ruta relativa.

<!--#FLASTMOD VIRTUAL="/rutaabsoluta/archivo.html"-->

Inserta fecha de última modificación de un archivo de la absoluta.

Fsize

<!--#FSIZE FILE="/rutarelativa/archivo.html"-->

Inserta tamaño de un archivo de la ruta relativa.

<!--#FSIZE VIRTUAL="/rutaabsoluta/archivo.html"-->

Inserta tamaño de un archivo de la ruta absoluta.

Exec

<!--#EXEC CMD="comando"-->

Ejecuta comando del sistema operativo como en la línea de comando.

<!--#EXEC CGI="script.cgi"-->

Ejecuta script. Es igual que una llamada desde un anclaje de HTML:

<A HREF="usr/local/bin/script.cgi>.

Plantillas de hora y fecha del comando SSI Config.

Plantilla - Formato

%c - DiaSemana mes dd hh:mm aaaa -> Jue Enero 7 14:30 1999

%A - DiaSemana -> Jue

%a - mes -> Enero

%X - hh:mm:ss -> 14:30:00

%H - Hora -> 14

%M - Minutos -> 30

%S - Segundos -> 00

%A - DiaSemana -> Jueves

%B - Mes -> Enero

%Y - Año -> 1999

%x - mm/dd/aa -> 01/07/99

%m - mes -> 01

%d - dia -> 07

%y - año -> 99

%I - hora (am|pm) -> 2 pm

%p - am|pm -> pm

10. FUNCIONES MATEMATICAS

Int()

Devuelve parte entera.

Sqrt()

Calcula raiz cuadrada.

Exp()

Número e de los logaritmos naturales elevado a la potencia.

Log()

Logaritmo natural en base e.

Sin()

Seno

Cos()

Coseno

Atan2(v1,v2)

Arco tangente de v1 dividido entre v2.

srand()

Número Aleatorio.