Saltar a contenido

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.

$nombre = "Juan Perez";
$edad = 25;
$estatura = 1.80;
$a = 1;
$a = 'cadena';

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

@midominio = (1,2,3,4);
$nombre = 'Juan';
$app = 'Perez';
$apm = 'Lopez';
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

if (condicion) {

} elsif (condicion) {

} else {

}

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:

for (inicialización; comparación; modificación) {
}

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:

while (comparación) {
    # código
}

until

do {
    # código
} until (comparación);

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.

$a = 'abcdef';
$c = chop($a);
print "$a\núltimo caracter:$c\n";

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.

  1. interpreta una cadena de expresiones de Perl y las ejecuta.
  2. 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:

metacpan.org

  • 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

cpanm -iqn Clase::Libreria

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

Tutorial recomendado de Perl

Sitio oficial de Perl, http://www.perl.org

Documentación de Perl, http://www.perldoc.com

Tutoriales de Perl, http://flanagan.ugr.es/perl/

Libros

Perl, Manual de Referencia
Martín C. Brown
McGraw-Hill