Fundamentos de programación en Perl
A little tutorial I gave at Talleres de Linux en la UPN in August 2002, trying to teach the main elements of Perl programming.
Licencia
Este tutorial fue escrito originalmente por Gunnar Wolf. Las versiones ampliadas o actualizadas del mismo serán publicadas en http://www.gwolf.org/soft/curso-perl
El texto, parcial o completo, de este tutorial puede ser copiado, modificado, redistribuído, incluído en otras obras o utilizado de cualquier manera siempre y cuando se reproduzca este aviso.
El autor no se responsabiliza de la veracidad, aplicabilidad, utilidad, ni de ninguna consecuencia derivada directamente o indirectamente de este texto.
1. Objetivos
Dar un panorama general del lenguaje de programación Perl para quien aún no lo conoce, mostrando sus principales características y las tareas para las que más frecuentemente es utilizado.
2. Introducción conceptual a Perl
- Un lenguaje natural comprensible por la computadora
- Un lenguaje natural ofrece gran riqueza de expresión,sintáctica y semánticamente - ¡Perl permite hasta escribir poesía!
- Orígenes y objetivos del lenguaje
- En 1987(8?): Lenguaje pegamento
- Herdero de C, awk, sed, ksh, csh...
- No nos obliga a seguir un paradigma específico, pero permite implemntar a casi cualquiera
- Altamente extensible
- Filosofía y frases comunes en el lenguaje
- TIMTOWTDI - Hay más de una manera dehacerlo.
- Hubris, impatiences, laziness
- Perl makes easy things easy, and difficult things possible
- ¿Dónde encontrar documentación?
3. Variables
- Escalares: $escalar
- Arreglos: @arreglo
- Hashes: %hash
- Breve mención de lo que hay más allá (*glob, \$var, ${$var}, espacios de nombres, variables/funciones anónimas, arreglos multidimensionales, estructuras de datos, closures, etc.)
4. La verdad... ¿Qué es la verdad?
- Es verdadero todo lo que no sea falso
- Es falso el valor indefinido (undef)
- Es falso el número 0
- Es falsa una cadena vacía ('')
- Es falsa la cadena '0'
5. Estructuras de control
- Condicionales
if <i>expr</i> {
(...)
} elsif <i>expr</i> {
(...)
} else {
(...)
}
(...) if <i>expr</i>
unless
<i>expr</i> and (...)
<i>expr</i> or (...)
<i>expr</i> ? (...) : (...)
- Ciclos
while (<i>expr</i>) {
(...)
}
until (<i>expr</i>) {
(...)
}
for (<i>expr1</i> ; <i>expr2</i> ; <i>expr3</i>) {
(...)
}
foreach <i>$var</i> (<i>lista</i>) {
(...)
}
- Control de flujo
last
next
die
redo
continue
- Pseudociclos
map {} ()
grep {} ()
sort {} ()
6. Operadores
- Aritméticos: +, -, *, /, %, **, ++, --
- Comparación: <, <=, ==, >=, >, lt, le, eq, ge, gt, <=>, cmp
- Asignación y correspondencia: =, =>, +=, -=, *=, /=, etc.
7. Cadenas y otras literales
undef
- Literales numéricas, constantes
- Cadenas simples:
'...', q(...)
- Cadenas con interpolación:
"...", qq(...)
- Cadenas resultado de ejecución:
`...`, qx(...)
- Otras maneras de referirse a cadenas:
qw(...), qr(...)
- Here docs
8. Ámbito de las variables
- Variables globales y el opcional
use vars, our
- Variables locales (
local)
- Variables léxicas (
my)
9. Uso de funciones
- Creación y llamada de funciones
- sub funcion { (...) }
&funcion(), funcion(), &funcion, funcion
- Paso de parámetros y valores de resultado, por valor y por referencia
- Arreglo default
@_ y por qué
return
- Funciones locales:
my $func = sub {...}
- Entregando múltiples datos, estructuras
10. Manejo de archivos
open estilo tradicional
- Sintaxis:
open (FILE, expr) (entre otras...)
- Modos de apertura de archivos
- < (default)
- >
- >>
- +<
- | (antes, después)
- Creando aliases de STDIN y STDOUT: '-' y '>-'
- Ver: perldoc -f open, perldoc opentut, perldoc perlipc
- Sintaxis orientada a objetos -
IO::File
- Mayor flexibilidad en modos de apertura (modos de apertura de
open y de sysopen, permisos)
- Manejo automático de archivos temporales usando el constructor new_tmpfile
- Importante: Siempre manejar condiciones de error
- Leyendo y escribiendo de archivos:
print ARCH 'algo';
- Eligiendo hacia dónde imprimir:
print { $ok ? STDOUT : STDERR } 'texto'
- <ARCH> y su comportamiento en diferentes contextos
11. Bibliotecas y módulos
- Prinicipios básicos de la reutilización de código
- Cualquier problema se puede partir en problemas pequeños una y otra vez. Conviene reunir los pedazos de código (funciones) que contribuyan a la solución de un problema específico, para poderlos aplicar fácilmente en otras ocasiones
- Compartir código es bueno, y es mejor compartir recetas sencillas y específicas que productos completos y potencialmente más difíciles de aplicar
- Bibliotecas
- Las bibliotecas son simplemente pedazos de código que son incluídos en el programa en tiempo de ejecución, cuidando de no incluirlas más de una vez.
- Una biblioteca es un archivo normal de Perl, situado en algún directorio mencionado en @INC, y con sufijo
'.pl'. Por ejemplo:
require 'biblioteca';
busca a biblioteca.pl en @INC, y evalúa al primero que encuentre.
- Si la expresión solicitada es un bareword, Perl asume que estamos intentando llamar a un módulo mediante require, busca el archivo con extensión
.pm, y traduce '::' por '/' en la búsqueda del archivo.
- Las funciones de bibliotecas típicamente entran al espacio de nombres actual.
- Al crear una biblioteca, es importante que el resultado de la evaluación sea verdadero, por lo que es sugerido que su último comando sea
1;
- Módulos
- Son la evolución natural de las bibliotecas, dando un paso hacia la orientación a objetos (de hecho, los objetos son implementados como módulos) adaptándose a los cambios introducidos en Perl 5. Además de los requisitos de las bibliotecas, los módulos llevan algo de información extra para facilitar interoperar con ellos.
- Todos los símbolos del módulo están restringidos a un espacio de nombres definido (y por convención, el espacio de nombres se llama igual que el módulo). El usuario tiene la opción de importar algunos de estos símbolos a su espacio de nombres, normalmente usando Exporter.
- Los módulos, a diferencia de las bibliotecas, son incluídos en tiempo de compilación.
- Son invocados con el comando
use módulo lista, donde módulo necesariamente es un bareword, y lista es la lista de símbolos a importar.
Es equivalente a:
BEGIN {require módulo; import módulo lista}
Mayor información:
perldoc perlmodlib
perldoc -f require
perldoc -f use
12. Módulos pragmáticos (pragmas)
Un pragma define el comportamiento del compilador frente a determinadas circunstancias
Los pragmas se activan con use pragma, pero a diferencia de los módulos, pueden ser desactivados con no pragma.
Esta activación/desactivación es léxica - es efectiva para el bloque o el paquete (dependiendo del caso) en el que fue declarada, no para el flujo lineal de la ejecución.
Algunos de los pragmas más utilizados son constant, diagnostics, integer, lib, vars, warnings
Mayor información:
perldoc perlmodlib
- Páginas de manual específicas de cada pragma
13. Prácticas importantes de seguridad
Uso del pragma strict
vars: Evitar variables no declaradas, sin ámbito o sin calificación de espacio de nombres completa.
No permite el uso de variables declaradas con local - únicamente con use vars, our, my, o nombre completo ($main::var)
refs: Evitar referencias simbólicas - Por ejemplo:
$var = 'valor';
print $$var; # Si no usamos strict, imprime $valor
subs: No permite el uso de barewords (palabras sueltas) - exige que las llamadas a funciones se expliciten, ya sea anteponiendo el signo & o especificando una lista de parámetros entre paréntesis (aunque esté vacía).
Reporte de warnings (por switch/variable, por pragma)
Nunca dejar cosas sin revisar
Mayor información:
14. (Embarrada de) conceptos importantes pero más avanzados
- Objetos
- Bloques especiales que modifican el flujo
- Interacción con CGI
- Interacción con bases de datos
- Programación orientada a redes con sockets