Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Perl significa Practical Extraction and Report Language, algo as como lenguaje prctico de extraccin y de informes. Es un lenguaje creado por Larry Wall (quien, por cierto, es, o era, uno de los pioneros de la red ms conocidos) con el objetivo principal de simplificar las tareas de administracin de un sistema UNIX; en realidad hoy en da (en su versin 5.8, y posiblemente pronto, la 5.10 y quizs la 6) se ha convertido en un lenguaje de propsito general, y una de las principales herramientas de un buen internetero y de un buen webmaster, aunque tambin se usa extensivamente en Bioinformtica y, en general, en casi todo. Perl es un lenguaje que hereda ciertas estructuras de los intrpretes de comandos de UNIX, especialmente el csh, y de otras utilidades estndar, como awk y sed. Aparte de esto, est diseado para hacer todo lo que hacen cualquiera de ellos y todos ellos juntos, y la mayora de las veces de forma ms simple, comprensible y fcil de depurar. Perl es un lenguaje interpretado, aunque en realidad, el intrprete de Perl, como todos los intrpretes modernos, compila los programas antes de ejecutarlos. Por eso se habla de scripts, y no de programas. Actualmente hay versiones para casi todos los sistemas operativos: Windows XP, Amiga, o MacOS. Los scripts son compatibles entre las diversas plataformas, de forma que es un verdadero lenguaje multiplataforma. Muchos fabricantes lo incluyen en sus versiones de UNIX; tambin el Linux lo incluye.
Si contesta algo as como lo anterior, es que est instalado. Y si quieres nota, escribe
bash$ perl -v This is perl, v5.8.0 built for i386-linux-thread-multi Copyright 1987-2002, Larry Wall 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 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using 'man perl' or 'perldoc perl'. If you have access to the Internet, point your browser at http://www.perl.com/, the Perl Home Page.
lo que, como ves, te devuelve la versin, e informacin adicional. Para bajarte la ltima versin para Windows, ve a http://www.activestate.com/activeperl
Bajo Linux/Unix emacs, x-emacs, gedit, kwrite, etc, son perfectos para editar pequeos programas. Bajo Windows, lo mejor es instalarse un editor para programadores, como el notepad++, o en todo caso, usar el edit o el Wordpad (desaconsejo el Notepad de Windows). Por otro lado, hay entornos de programacin especficos para perl, como PerlIDE o Komodo. Este ltimo es de pago, pero se puede usar durante un tiempo limitado. Estos entornos permiten desarrollar proyectos completos ms comodamente, pero, para los efectos de ste curso, un editor de textos orientado a programacin es suficiente. Para crear nuestro primer programa, slo tenemos que abrir el editor de textos y teclear:
print este es mi primer programa en Perl \n;
Y eso es todo! No hay necesidad de abrir el programa, ni de cerrarlo, ni de incluir libreras estndar, ni nada de nada. Solamente hay que tener cuidado de terminar todas las sentencias con punto-y-coma (;). El smbolo \n se suele leer "escape-N" y tiene el mismo significado que en C, es decir, un retorno de carro. Guardaremos el programa en un fichero con el nombre primero.pl y lo ejecutaremos, si estamos en Linux, con:
~/tutoriales$ perl primero.pl este es mi primer programa en Perl
o si estamos en Windows (y tenemos Perl instalado y perl.exe est en el PATH de ejecucin), desde el smbolo del sistema (CMD), con:
C:\tutoriales> perl primero.pl este es mi primer programa en Perl
Si ests en Linux/UNIX, se utiliza una sintaxis similar a los scripts del intrprete de comandos, es decir, guardar el fichero con una primera lnea que indica dnde est el intrprete que va a ejecutar el resto del fichero. En el caso del Perl bajo Linux, debe ser algo como:
#!/usr/bin/perl print este es mi primer programa en Perl \n;
Tras guardarlo (seguimos con el ejemplo bajo Linux), le damos permisos de ejecucin, y ya podemos ejecutarlo sin invocar directamente al intrprete:
~/tutoriales$ chmod 755 primero.pl ~/tutoriales$ ./primero.pl este es mi primer programa en Perl
En Windows, la instalacin del ActivePerl nos har la asignacin de la extensin .pl al Perl.exe, por lo que podemos hacer doble clic sobre los programas y el sistema llamar automticamente al intrprete de Perl.
Que todas las variables contengan un $ significan que representan un escalar. Esto lo veremos en el siguiente apartado. Los valores enteros no pueden empezar por cero porque esto permite especificar un entero mediante su codificacin octal o hexadecimal. El cdigo octal se antecede con en cero 0; el cdigo hexadecimal se antecede con un 0x o 0X. Por ejemplo:
my $x = 0377; my $y = 0xff; # equivale a 255 # equivale a 255
asignan al escalar la cadena de caracteres "Hola mundo!". Por el contrario, las cadenas de caracteres delimitadas por apstrofes se dejan intactas. Por ejemplo:
my $str = 'Hola $wld!';
El tipo booleano
El tipo booleano existe, al igual que en C, de modo implcito, es decir, un nmero es falso si es igual a cero y verdadero en cualquier otro caso. Como el cero est asociado a la ristra vaca (""), sta tambin equivale al valor falso.
Estas tres representaciones permiten asociar a cada variable utilizada un tipo. Por otra parte, las variables Perl se asignan de manera dinmica y se les asigna un valor predeterminado en funcin del contexto.
Los escalares
El escalar representa el tipo bsico en Perl. Permite representar enteros, reales y cadenas de caracteres. A continuacin veremos algunos ejemplos:
my $real = 4.53; my $entero = -45; my $cad = "Hola";
Las variables en Perl se asignan de manera dinmica y se les asigna un valor predeterminado en funcin del contexto. En un contexto numrico el valor predeterminado es 0, mientras que en un contexto de cadena de caracteres el valor predeterminado es la cadena vaca "". Como ya hemos dicho, cuando una cadena de caracteres se delimita por comillas, el contenido de esta cadena es analizado por Perl para el reemplazo eventual por su valor de las variables escalares identificadas por el smbolo $. Este anlisis se denomina interpolacin de variables y puede evitarse poniendo delante del smbolo $ una barra oblicua inversa \ o delimitando la cadena de caracteres con apstrofes. El tipo y el valor de las variables en Perl se determina a partir del contexto. As, una cadena de caracteres conteniendo un valor numrico ser convertida en variable numrica en un contexto numrico. Consideremos el cdigo siguiente:
my $x = 4.1; my $y = "11"; my $z = $x + $y; my $t = $x . $y; # un real # una cadena de caracteres # suma de dos valores numricas # concatenacin de dos cadenas
Al final del cdigo la variable $z tiene el valor 15.1. Por otro lado, la variable $t contiene el valor "4.111". Por lo tanto en Perl no es necesario realizar una declaracin de tipos, ni es necesario el operador cast, ni tampoco es necesario dar formato a los valores a la hora de imprimirlos como ocurra en C. Esta interpolacin se produce a menudo en unas lneas de cdigo tales como las siguientes:
my $year = 35; print "Tengo $year aos";
El resultado de estas lneas de cdigo es: "Tengo 35 aos"; el contenido de la variable year se ha convertido en una cadena de caracteres.
Los arrays
Un array es una lista de datos de tipo escalar. Cada elemento de la lista es una variable escalar a la que se le asocia un valor. Igual que a las variables escalares se les antepone el smbolo $, las variables de tipo array se identifican por el prefijo arroba @. Por ejemplo:
my @numeros = (2, 1, 667, 23, 2.2, 5, 6); my @letras = ("perro", "gato", "len"); my @mezcla = ("hola", 23, "adios", 31.234);
Tambin se permite definir los elementos de un array a partir de sus valores extremos utilizando el operador "..", como se muestra a continuacin:
my @alfabeto = ('a'..'z');
Los elementos de un array se referencian mediante ndices (al estilo de las tablas de C++). El primer elemento se referencia por el ndice 0. El ltimo ndice viene dado por el operador " $# " El nmero de elementos de un array se podra calcular como: ( $#matriz + 1 )
Puesto que un elemento del array ser (en principio) un escalar, se acceder a l usando la sintaxis de corchetes y anteponindole el smbolo $. Por ejemplo:
$numeros[4]; $letras[2]; $mezcla[0]; # vale 2.2 # vale "len" # vale "hola"
Tambin se puede acceder a un array mediante el operador que define una horquilla de ndices (".."). Por ejemplo:
my @num1 = @numeros[1..3]; my @str = @letras[0,2]; my ($cadena, $num) = @mezcla; # @num1 = (1, 667, 23) # @str = ("perro", "len") # $cadena ="hola", $num =23
Esta ltima instruccin vemos que permite asignar los dos primeros valores del array @mezcla a las variables escalares $cadena y $num. Por otro lado, el acceso a un array fuera de rango devuelve un valor indefinido 0 o "" segn el contexto. Por ltimo, si vemos las siguientes lneas de cdigo:
my @a=(1,2,3); my @b=(5,6,7); my @c=(@a,4,@b,8);
Estas expresiones generan tres arrays, (1,2,3), (5,6,7) y (1,2,3,4,5,6,7,8), y no, como podra pensarse un array de arrays, cuando incluimos un array dentro de otro, Perl "aplana" el array insertado uno a uno todos sus elementos en la posicin indicada del array que ha de contenerlos, para hacer array de arrays deberemos usar referencias a estos.
tras la segunda instruccin, @matriz pasa a tener (1,3,5, 2,4,6). Tras la tercera instruccin, @matriz pasa a tener (1,3,5,2,4) y $a tiene 6. unshift() inserta un elemento por el principio del array, mientras que shift() saca un elemento del principio.
my @matriz = (1,3,5,2,4); unshift(@matriz, 7,8); my $b = shift(@matriz);
tras la segunda instruccin, @matriz pasa a tener (7,8, 1,3,5,2,4). Tras la tercera instruccin, @matriz pasa a tener (8,1,3,5,2,4) y $b tiene 7.
En este caso, para acceder a cualquiera de los elementos de %cuota debemos conocer su clave. Por ejemplo:
my $id = $cuota{"pat"}; # $id = 256
Este tipo de dato se puede utilizar para guardar los datos relativos a un objeto, de forma que ms tarde accedamos a travs de los nombres de sus caractersticas, y no mediante un ndice a cada caracterstica. Esta lista puede completarse aadiendo nuevos valores y asociando a cada clave el valor correspondiente. Por ejemplo:
$cuota{"dave"} = 250;
Un error comn a la hora de mostrar los valores de una matriz N-dimensional es intentar imprimir el objeto @matriz, lo cual mostrar una lista de las referencias a cada fila de la matriz:
print @matriz; # muestra una lista de referencias
Entrada/Salida estndar
Para leer desde entrada estndar (teclado habitualmente, salvo si hacemos redireccin), usamos <STDIN>
my $nombre = <STDIN> ; my @valores = <STDIN> ;
en el primer caso se lee una lnea (hasta pulsar el retorno de carro). En el segundo caso se leen varias lneas asignndolas a cada casilla de la matriz, hasta que se pulsa CTRL-D Para escribir en la salida estndar, smplemente utilizamos el operador print que ya hemos visto.
Abrir ficheros
Debemos utilizar el operador open() como sigue:
open(LEER, "path_fichero_leer"); open(SUSTITUIR, ">path_fichero_sustituir"); open(AADIR, ">>path_fichero_aadir");
debemos indicar un manejador de fichero (el que queramos; se siguen las normas de declaracin de variables), y tambin si vamos a leer, sustituir el contenido, o aadir al final del fichero:
open(F, "<path_fichero"); # abrir para lectura open(F, ">path_fichero"); # abrir para escritura sustituyendo el contenido open(F, ">>path_fichero"); # abrir para escritura aadiendo al final
Cerrar ficheros
Debemos utilizar el operador close() como sigue:
close(MANEJADOR);
Debemos utilizar el operador <MANEJADOR> para leer, y el print para escribir, como sigue:
open(F1, "fich_origen"); open(F2, ">fich_destino"); while ( <F1> ) { print F2 $_; } close(F1); close(F2);
El cdigo anterior copia un fichero en otro: se va leyendo el contenido del primer fichero y se va escribiendo en el segundo (hasta que se vaca el primero). Una forma alternativa para leer de un fichero es almacenando todo el contenido del fichero en un array. Despus ya podremos acceder al array:
open(F, "fich_origen"); my @datos=<F>; close(F); my $linea; foreach $linea ( @datos ) { print $linea; }
Existe una variable especial ($_) en la que se almacena cualquier cosa que se lea de un fichero o de entrada estndar (si no se indica otra a la que se asigna lo ledo).
El programa evala la expresin. Cuando esta expresin resulta verdadera, se ejecuta la instruccin o el bloque de instrucciones 1. Por contra, cuando es falsa de ejecuta la instruccin o bloque de instrucciones 2. Esta ltima parte es opcional. Perl es muy verstil, y se pueden usar otras construcciones condicionales:
my $a = <STDIN>; print todo bien if ( $a eq ok);
Una construccin similar al if .. else es la ?: (existe tambin en C y C++). Permite consultar una condicin, y en funcin del resultado, asignar un valor u otro:
my $a = <STDIN>; my $b = ($a eq ok) ? todo bien : algo mal ;
En este ejemplo, si la variable $a ha recibido el valor ok, entonces la variable $b recibe el valor todo bien. En otro caso, la variable $b recibe el valor algo mal.
La instruccin unless
Esta instruccin es anloga al if, salvo que permite considerar la no verificacin de la prueba. Su sintaxis es la siguiente:
unless (expresin) { instruccin o bloque de instrucciones 1; }
La instruccin while
La instruccin while ejecuta iterativamente un bloque de instrucciones mientras una expresin sea vlida, evaluando la comprobacin en cada iteracin. Cuando la prueba es vlida, se ejecuta la instruccin o el bloque de instrucciones delimitado por las llaves. La sintaxis de esta instruccin es:
while (expresin) { instruccin o bloque de instrucciones; }
La instruccin for
La instruccin for permite ejecutar iterativamente un conjunto de instrucciones. La sintaxis de la instruccin for es:
for (inicial_exp; test_exp; incremento_exp) { instruccin o bloque de instrucciones; }
donde inicial_exp es la instruccin que inicializa el bucle. Consiste generalmente en la asignacin de un valor a una variable que permite controlar el nmero de iteraciones. test_exp es la expresin evaluada en cada iteracin. Cuando esta expresin es verdadera, el bloque de instrucciones se ejecuta. incremento_exp es la expresin que permite la actualizacin de la variable que controla el nmero de iteraciones. A continuacin veremos un ejemplo de esta estructura para iniciarnos en su manejo:
print "10 Iteraciones\n"; for (my $i=0; $i<10; $i++) { print "Interacin nmero $i\n"; }
La instruccin foreach
La instruccin foreach es similar a la funcin del mismo nombre de los Shells de Unix. Asocia iterativamente a una variable cada elemento de la lista. Esta sucesin de valores sirve para parametrizar la ejecucin del bloque de instruccin. La sintaxis de la instruccin foreach es:
foreach $variable (@lista) { instruccin o bloque de instrucciones; }
Las instrucciones for y foreach son equivalentes. Sin embargo, la utilizacin de una de estas instrucciones se justifica generalmente por el contexto. El ejemplo siguiente lo ilustra:
my @lista = ("elem1", "elem2", "elem3", "elem4"); for ($i = 0; $i<= $#lista; $i++) { print $lista[$i], "\n"; }
Este ejemplo no utiliza las caractersticas de los arrays en Perl. La utilizacin de la instruccin foreach permitir recorrer la lista de forma ms elegante. El ejemplo siguiente lo ilustra:
my @lista = ("elem1", "elem2", "elem3", "elem4"); foreach $elem_actual (@lista) { print $elem_actual, "\n"; }
Existe en Perl una variable especial llamada $_ que se utiliza principalmente en este tipo de bucles. En cada pasada del bucle el valor extraido del array se instancia a la variable escalar $_ que pasa a utilizarse en el cuerpo del bucle:
my @lista = ("elem1", "elem2", "elem3", "elem4"); foreach (@lista) { print $_, "\n"; }
La instruccin goto
La instruccin goto label permite cambiar el recorrido lineal de las lneas de cdigo prosiguiendo la ejecucin del programa en la lnea de etiqueta label. La etiqueta se define colocando al final del identificador dos puntos (:). En el siguiente ejemplo se podr ver mejor la construccin del goto.
if ($expr ne $expr_correcta) { goto error; } ... error: print "expresin incorrecta";
La utilizacin del goto en Perl no es recomendable. Por que le quita al cdigo legibilidad y aumenta la posibilidad de errores.
La instruccin next
La instruccin next es idntica a la instruccin continue en C. Interrumpe la ejecucin del bloque de instruccin actual y prosigue la ejecucin en la iteracin siguiente. Esta instruccin no interrumpe completamente la ejecucin del bucle; la expresin que controla el bucle se evala. Si el resultado de la expresin es vlido, el bucle se ejecuta de nuevo. Cuando una instruccin tiene como argumento una etiqueta, la instruccin prosigue en la lnea identificada por la etiqueta y no al principio del bloque.
La instruccin until
La instruccin until al igual que la instruccin while permite ejecutar un conjunto de instrucciones un nmero repetido de veces. Pero al contrario que la instruccin while, la instruccin until ejecuta dicho bloque de instrucciones mientras no se verifique la comprobacin. La sintaxis es:
until (expresin) { instruccin o bloque de instrucciones; }
Comienzan por la palabra reservada sub, a continuacin ponemos el nombre de la subrutina y el bloque o cuerpo. Para llamarla desde el programa principal slo tenemos que escribir su nombre. Si no tiene parmetros no estamos forzados ni a poner los parntesis vacos (como s ocurre en C++):
# llamada sin parmetros una_subrutina; # llamada con un parmetro una_subrutina("hola"); # llamada con dos parmetros una_subrutina(5-3, "segundo parmetro");
Si llamamos a una subrutina con ms parmetros de los que debe recibir, no se produce ningn error, simplemente se ignoran los sobrantes.
Parmetros
Cuando una subrutina recibe parmetros, estos son pasados como una lista en el array especial @_. Ese array no tiene nada que ver con la variable $_. Si recordamos las matrices veremos que cada uno de los parmetros ser una variable dentro de la matriz que se direcciona as $_[0], $_[1], etc.
# Llamada a la subrutina con 2 parmetros: saludo ("Hola","Mundo\n"); @_=("Hola","Mundo\n");
equivaldra a:
$_[0]="Hola" y $_[1] = "Mundo\n";
Al igual que otra variable-array, puede ser accedida con la notacin de corchetes, mediante las variables $_[0], $_[1], ..., que nada tienen que ver con la variable $_:
sub print_2_args { print "Primero= $_[0] \n"; print "Segundo= $_[1] \n"; }
Otras variables que no sean las @_, $_[i] o las definidas como locales a que hagamos referencia dentro de la subrutina sern globales, con lo cual si modificamos alguna de ellas, al salir de la subrutina, se habrn modificado. A veces esto nos interesar, pero a veces no. Cuando no queramos ver modificadas las variables globales desde dentro de una subrutina, deberemos utilizar variables locales.
Si asignamos un valor a una nueva variable dentro de una subrutina, y esa variable no es local a la subrutina, se crear como global, pudiendo utilizarse al volver de la llamada a la subrutina:
sub vars_globales2 { $nueva_variable = "valor"; } vars_globales2; print "$nueva_variable"; # imprime "valor"
Variables locales
La variable @_, al igual que $_[0], $_[1], ... son locales a la subrutina. Perl permite que podamos definir en las subrutinas nuestras variables locales, mediante la palabra reservada my. Otra opcin es usar la palabra reservada local:
sub vars_locales { local($a, $b); ($a, $b) = ($_[0], $_[1]); ( $a =~ /$b/ || $b =~ /$a/ ); }
devuelve verdadero si el primer parmetro o el segundo esta dentro del otro (o falso en caso contrario). Esta es la forma de evitar el problema que tena la subrutina vars_globales Las variables locales son tiles para no modificar las variables globales. Al definir las variables locales podemos asignarles el valor en la misma lnea con:
local($a, $b) = ($_[0], $_[1]);
Valores de retorno
Perl tambin nos permite retornar valores y lo hace tomando como retorno el ltimo valor escalar que se emplee en la subrutina. El resultado que devuelve una subrutina es la ltima cosa evaluada. As, la subrutina que vimos antes que imprima los parmetros que reciba, devuelve siempre un 1 (verdadero), que es lo que devuelve la orden print. Para devolver un valor, podemos hacer dos cosas:
sub maximo { if( $_[0] > $_[1] ) { $_[0]; }else{ $_[1]; } } $mayor = maximo(37,23); #devuelve 37
o bien:
sub maximo { if( $_[0] > $_[1] ) { return $_[0]; }else{ return $_[1]; } } $mayor = maximo(37,23); #devuelve 37
Si no utilizamos "return", se devuelve el valor de lo ltimo que evaluramos. Adems de devolver valores escalares, podemos devolver valores ms complejos, como un array:
sub devolver_matriz { local(@matriz); $matriz[0]=hola; $matriz[1]=adios; return @matriz; } # Llamada a la subrutina que devuelve una matriz print devolver_matriz();
nos buscar en los ficheros con extensin .txt del directorio donde estamos en ese momento cualquier lnea que contenga las cadenas grep o Unix. Adems de las alternativas en la expresin regular, especificada con el carcter |, podemos especificar rangos de caracteres, utilizando los corchetes ([ ]); un carcter cualquiera utilizando el punto (.); que cierto sub-patrn aparezca como mucho una vez (?) o que aparezca cero o mas veces (*) o que aparezca una o mas veces (+); etc, etc.
Para utilizarlas, debemos encerrar entre // el patrn (mientras que en grep se colocaban indicadas con -e y entre comillas). Normalmente devolvern un valor lgico indicando si la variable sobre la que queremos aplicarla contiene o no el patrn. Si no se indica otra cosa, por defecto comparar la expresin con la variable "por defecto" $_. Por ejemplo:
/pepe/
imprimirn si, ya que la expresin regular devuelve el valor lgico de verdadero. Si queremos utilizar otra variable diferente a la $_ debemos utilizar el operador =~ , por ejemplo:
my $cad =~ /pepe/
es cierto si la cadena pepe est incluida en $cad Las expresiones regulares son sensibles a maysculas, as, la expresin:
my $cad = "Pepe come queso"; $cad =~ /pepe/;
es falsa, ya que $cad no contiene la subcadena pepe, aunque contenga la subcadena Pepe. El operador que hace lo contrario que el =~ es el !~ , as, la expresin:
my $cad = "Pepe come queso"; $cad !~ /pepe/;
es cierta.
my $cad = "Pepe come queso";
if($cad !~ /pepe/) { print "la cadena NO incluye el patrn"; } if($cad =~ /pepe/) { print "la cadena SI incluye el patrn"; }
^ que indica que debe coincidir al principio de la cadena $ que indica que debe coincidir al final de la cadena \b que especifica los lmites de una palabra \B que especifica los lmites fuera de una palabra Los posibles tomos cuantificados son: {n,m} el tomo debe aparecer entre n y m veces {n,} el tomo debe aparecer al menos n veces {n} el tomo debe aparecer exactamente n veces * el tomo debe aparecer 0 o ms veces (como {0,}) + el tomo debe aparecer 1 o ms veces (como {1,}) ? el tomo debe aparecer 0 o 1 veces (como {0,1}) una cadena tal cual, encerrada o no entre parntesis un . especifica cualquier carcter salvo el retorno de carro una lista de caracteres entre corchetes ([ ]) especifica uno de esos caracteres. Un carcter ^ delante de los corchetes niega la clase. se pueden especificar rangos en los corchetes, de la forma a-z \n retorno de carro (nueva lnea) \r retorno de carro (vuelta al principio de lnea) \t tabulador \d un dgito (igual que [0-9]) \D un carcter que no sea dgito \w un carcter alfanumrico (como [0-9a-z_A-Z]) \W un carcter no alfanumrico \s un carcter de espaciado (como [ \t\r\n]) \S un carcter que no sea de espaciado un \0 seguido de un nmero corresponde con ese nmero en octal un \x seguido de un nmero hexadecimal corresponde con ese nmero en hexadecimal
Cualquier otro carcter "escapado" coincide consigo mismo. Cualquier carcter no mencionado coincide consigo mismo.
Enlaces
http://www.perl.com http://www.activestate.com/ http://merelo.net/tutoperl/ http://merelo.net/tutoperl/tutoperl18.html http://atc.ugr.es/pedro/tutoriales/cursos/perl/ http://atc.ugr.es/pedro/tutoriales/cursos/cgi/ http://www.amazon.com/exec/obidos/ASIN/0879305894/perltutobyjjmere http://http//samie.sourceforge.net/samiedoc/perlide.html http://http//www.activestate.com/Products/Komodo/