Introducción a Perl
eFlow se desarrolló durante los años de 1998 y 2002. Durante estos años Perl era un lenguaje popular para el desarrollo de aplicaciones Web, cuenta con varias bondades:
- Es muy sencillo de aprender
- Es un lenguaje de scripts con un nivel de ejecución bastante rápido
- No es estructurado, no requiere de declaraciones de variables y todos los tipos de datos son "variant".
Si bien eFlow permite el uso de otros lenguajes para crear ventanas emergentes que permitan interactuar a eFlow con otros sistemas. Perl, es el único lenguaje con el que se pueden programar preprocesos y postprocesos.
Esta es la principal razón por la que debemos de aprender Perl para poder explotar las capacidades de eFlow al máximo.
Esta breve introducción pretende ayudar a un programador que no se encuentra familiarizado con el lenguaje que pueda adquirir los conocimientos básicos que le permitan leer el código de eFlow, crear y modificar postprocesos y preprocesos, dentro del entorno de desarrollo de eFlow.
Variables
No es necesario declarar las variables antes de usarlas. Si una variable no se declara como
explícitamente local se considera global.
Perl solo maneja las siguientes tipos de datos: enteros, números decimales, cadenas de texto y apuntadores.
Y estos tipos de datos se pueden organizar dentro de las siguientes estructuras : variables escalares, arreglos y hash.
Escalares
Similar a las variables tipo "Variant" de otros lenguajes. Las variables escalares se declaran con el signo de pesos y a continuación el nombre.
Como se puede observar en los ejemplos, no hubo necesidad de declarar el tipo de datos que deseamos almacenar en la variable, simplemente lo hemos asignado. También podemos ver que en el caso de la variable $a, le asignamos un valor entero y posteriormente uno de cadena de texto. Esto es legal la variable no está atada a ningún tipo de valor específico.
Comillas sencillas y dobles
Para asignar valores de cadena podemos usar las comillas sencillas o dobles. Cada una tiene un significado especial al momento de realizar la asignación.
Comillas sencillas
La cadena es literal como se ve escrita. Esto es, se asignan los valores exactamente como aparecen dentro de las comillas sencillas, no hay ninguna interpretación de los datos, sustitución de valores, etc.
Comillas dobles
La cadena es interpretada y los valores internos son evaluados para formar la cadena final.
Ejemplo:
Para los siguientes valores
Expresión | Resultado |
---|---|
'La dirección de correo es cuenta@midominio.com' | La dirección de correo es cuenta@midominio.com |
'El monto total es $ 40,000 pesos' | El monto total es $ 40,000 pesos |
"La dirección de correo es cuenta@midominio.com" | La dirección de correo es cuenta1234.com |
"El monto total es $ 40,000 pesos" | El monto total es 40,000 pesos |
"Mi nombre es $nombre $app $apm" | Mi nombre es Juan Perez Lopez |
"El monto total es \$ 40,000 pesos" | El monto total es $ 40,000 pesos |
Arreglos
Los arreglos son una colección de elementos que no necesariamente deben ser del mismo tipo, es decir, dentro de una variable tipo arreglo se puede almacenar un número indeterminado de elementos, los cuales pueden ser cadena, entero, decimal, otra variable, un apuntador etc. A diferencia de otros lenguajes, no se necesita declarar la longitud del arreglo, este crece o se achica dinámicamente conforme se manipula el arreglo.
Los arreglos se declaran usando el símbolo de la arroba "@".
Y para acceder a sus elementos se usa el signo de "$" y los corchetes para indicar la posición en el arreglo "[indice]", indicando que deseamos realizar una acceso a un elemento como si fuera un escalar. Todos los arreglos inician con el índice 0
Ejemplos
$app = 'Perez';
$apm = 'Lopez';
@numeros = (1,2,3,4);
@revuelto = ('Nombre',23,$app,&$apm,3.1416);
$#@numeros; #esto es igual el último índice del arreglo.
$numeros[1]; # Valor 2
$numeros[$#numeros]; # Valor 4
$revuelto[2] = # Valor Perez
Hash
Las estructuras de este tipo son un arreglos en donde los índices pueden ser números o letras. Se manejan de igual manera que los arreglos. Para declararlos usamos el símbolo de porcentaje "%Para acceder a un índice utilizamos el signo de "$" y las llaves "{indice}", para indicar la posición.
$app = 'Perez';
$indice = 'apellido';
%numeros = (
'uno',1,
'dos',2,
'tres'3,
'cuatro',4
);
%persona = (
'nombre','Juan',
'edad',23,
'apellido',$app,
'pi',3.1416
);
$numeros{'dos'}; # Valor 2
$persona{'edad'}; # valor 23
$persona{$apellido}; # Valor 'Perez'
Control de flujo
if
Cuidado
Como Perl no cuenta con tipos de datos, es necesario indicar que tipo de comparación deseamos hacer entre dos variables. Una comparación de tipo cadena, o una comparación numérica.
Comparación | Numérica | Cadenas |
---|---|---|
Igual | == | eq |
Diferente | != | ne |
Mayor que | > | gt |
Menor que | < | lt |
Mayor o igual | >= | ge |
Menor o igual | <= | le |
And = &&
Or = ||
for
La estructura de un for es de la siguiente manera:
Donde:
parte | significado |
---|---|
inicialización | asignar valor inicial a variable de control |
comparación | condición que se debe cumplir para llevar a cabo el ciclo |
modificación | modificar variable de control |
for ($i=5; $i < 10; $i++) {
print "I = $i\n";
}
for ($i=10; $i > 5; $i--) {
print "I = $i\n";
}
for ($a = '123456'; length($a)>0; $char = chop($a)) {
print "$char\n";
}
while
La estructura de un while es de la siguiente manera:
until
foreach
El foreach itera sobre los valores de un arreglo o lista en orden secuencial, extrayendo el primer elemento de la lista en cada vuelta hasta que el arreglo ya no tenga más elementos. Esta acción no modifica el arreglo original.
foreach $variable (@arreglo) {
print "$variable\n";
}
# Ejemplo:
@nombres(‘diana’,’david’,’Juan’,’miguel’,’humberto’);
foreach $nombre (@nombres){
print "Nombre = $nombre\n";
}
Funciones predefinidas
chop
Elimina el último caracter de la cadena (esto hace que se acorte un caracter), y regresa el caracter extraído.
uc, lc, ucfirst, lcfirst
función | acción |
---|---|
uc | Convierte las letras minúsculas en mayúsculas. |
lc | Convierte las letras mayúsculas en minúsculas. |
ucfirst | Convierte la primer letra en mayúscula. |
lcfirst | Convierte la primer letra en minúscula. |
join
La función join se utiliza para unir elementos en una lista por medio de un símbolo.
join exp,lista;
# exp = Carácter que unirá los elementos.
# lista = Lista que va a unir.
@palabras = ('uno','dos','tres',123,456,789);
$concatenado = join '|',@palabras;
print "Concatenado = $concatenado\n"; # Concatenado = uno|dos|tres|123|456|789
split
Esta función separa elementos, los cuales pasa a un arreglo, se puede aplicar tanto a arreglos como variables.
split /regex/,variable;
# separador : Es el carácter donde termina el elemento
# variable : Es lo que se va a separar
$linea = "Hans,Peyrot,39,1.86,Veracruz";
@v = split /,/,$linea; # Valores se localizan en $v[0],$v[1], ...
($nom,$ap,$edad,$est,$cd) = split /,/,$linea; # Valores asignados directamente a cada variable
eval
La función eval tiene 2 usos principales.
- interpreta una cadena de expresiones de Perl y las ejecuta.
- Ejecutar una porción de código sin detenerse si hay errores de ejecución. Permite controlar errores en módulos, objetos, etc.
$formula = '$v = $d / $t';
$d = 100;
$t = 2;
eval $formula;
print "$v\n"; # $v = 50
$b = 0;
eval {
$v = $d / $b;
};
if ($@) {
print "Error de ejecución: $@";
exit 0;
}
Subrutinas y Funciones
En Perl, todas las subrutinas regresan un valor, este valor puede ser explícito si se utiliza la instrucción "return. O implícito, cuando no se regresa un valor con return, el valor regresado por la última instrucción dentro de la subrutina.
$numero_1 = 10;
$numero_2 = 982;
$mensaje = "Ejemplo 1 de subrutinas";
print "$mensaje \n";
$res = suma();
print "Resultado = $res";
# Subrutina
sub suma{
my $r;
$r = $numero_1 + numero_2;
return $r;
}
# Ejemplo 2 de subrutinas
$info ="Juan-25-11/11/1978-Mexico,D.F.";
separa();
# Subrutina
sub separa{
@valores = split /-/,$linea;
foreach $info (@valores){
print "$info";
}
}
Variables Globales y Locales
En Perl existen variables globales y locales. Las globales son aquellas que se pueden utilizar en cualquier parte del programa, las locales, en cambio, se usan en bloques de código, como funciones o subrutinas.
Al momento de declarar cualquier variables se crea como variable global, a menos que
antepongamos la palabra reservada my antes de la declaración de la variable, en este caso la
variable pasa a ser local dentro del bloque en el que se declara.
# Declaración de una variable global
$var;
# Declaración variable local
my $var;
$global = "Global";
print "Esta es una variable global : $global\n";
local();
sub local{
my $global="Local";
print "Esta es una variable local : $global\n";
}
Parámetros a subrutinas
Los parámetros a subrutinas de perl siempre es por valor.
Si deseamos enviar un valor por referencia debemos enviar un apuntador a nuestra variable.
$a = "Valor especial";
rutina($a)
rutina2($a,'otro valor',\$a); # \ : pasar el apuntador a la variable, no el valor
rutina3($a,'otro valor',\$a);
sub rutina {
my $variable = shift;
print "Mi parámetro es : $variable\n";
}
sub rutina2 {
my ($v1,$v2,$apuntador) = @_;
# valores en $v1,$v2 y $apuntador
}
sub rutina3 {
my @v = @_;
# valores en $v[0], $v[1], $v[2]
}
Expresiones regulares
Las expresiones regulares son patrones que se buscan dentro de un texto, como patrón entendemos cierta combinación de caracteres.
Encontrar y reemplazar
=~ s/patron buscado/reemplazo/gi;
elemento | significado |
---|---|
patron | Lo que se busca |
reemplazo | Por lo que será reemplazado el patrón |
g | Busca todas las ocurrencias (opcional) |
i | Ignorar capitalización (opcional) |
Encontrar
=~ /patron/gi;
elemento | significado |
---|---|
patron | Lo que se busca |
g | Busca todas las ocurrencias (opcional) |
i | Ignorar capitalización (opcional) |
Símbolos especiales en los patrones
Símbolo | significado |
---|---|
. |
Cualquier carácter |
\ |
Metacaracter, escapar siguiente caracter, no interpretar algún significado |
^ |
Encontrar el patrón al inicio de la cadena |
$ |
Encontrar el patrón al final de la cadena |
| | Alternar entre dos valores alrededor de la barra |
() |
Agrupar un patrón |
[] |
Crear una clase de caracteres a buscar |
MODIFICADORES
Símbolo | significado |
---|---|
+ |
Una o mas veces |
* |
Cero o mas veces |
? |
Cero o una ves |
PREDEFINIDOS
Símbolo | significado |
---|---|
\d |
Dígito |
\D |
No dígito |
\w |
Caracter de palabra a-z,0-9 y _ |
\W |
No letra de palabras |
\s |
Caracter en blanco |
\S |
No caracter en blanco |
ACCESO A ARCHIVOS
La instrucción para abrir un archivo es : open(Descriptor,"opcion[:codificación]"","ruta a archivo");
Elemento | Significado |
---|---|
Descriptor | Referencia al archivo, ejemplos : $fh , MEMO |
Ruta a archivo | Ruta donde se localiza el archivo en el sistema |
opción | Forma en que se desea abrir el archivo. |
< |
Lectura |
> |
Escritura (borra el archivo si existe) |
<+ |
Lectura y escritura |
>+ |
Escritura y lectura (borra el archivo si existe) |
>> |
Append |
codificación | Que codificación deseamos usar para leer o escribir |
Omitido | ISO-8859-1 (Latin1) |
utf8 | Codificar o decodificar UTF8 |
if (open(MEMO,"<:utf8","memo.txt")) {
print "Archivo memo.txt abierto para lectura\nDecodificando UTF8\n";
print "Contenido del archivo\n";
while ($linea = <MEMO>) {
print "Línea leida : $linea\n"
}
} else {
print "Error al abrir memo.txt";
exit 0;
}
Librerías y objetos
Perl, permite cargar librerías o paquetes de objetos que nos permiten extender el uso del lenguaje, existen muchas librerías para diferentes funciones, como por ejemplo:
- Manipulación de fechas
- Conexiones a servidores : HTTP, HTTPS, FTP, SSH, servicios REST, WebService, etc.
- Procesar documentos : PDF, Excel, CSV
- Clientes de bases de datos : Postgresq1, MSSQL, MySQL, sqlite, Oracle, etc.
Las librerías se localizan en la siguiente dirección:
- Busque por funcionalidad, nombre, etc.
- Cada librería disponible cuenta con documentación de como se usa
Para poder instalar una nueva librería.
Como usuario root, en una sesión de bash
Para cargar y usar una librería.
use DBI;
$dbh = DBI->connect("dsn a base de datos") or die "DBI::errstr";
$sth = $dbh->prepare("select * from tabla") or die "DBI::errstr";
$sth->execute() or die "DBI::errstr";
while ($rs = $sth->fetchrow_hashref) {
print "Valor de tabla: $$rs{'columna'}\n";
}
Referencias
Sitios en Internet
Sitio oficial de Perl, http://www.perl.org
Documentación de Perl, http://www.perldoc.com
Tutoriales de Perl, http://flanagan.ugr.es/perl/