Fundamentos de programación en Perl

Written in...: 
2002

A little tutorial I gave at Talleres de Linux en la UPN in August 2002, trying to teach the main elements of Perl programming.

Resumen: 

Un pequeño curso que impartí en agosto del 2002 en los Talleres de Linux en la UPN, cuyo objetivo es enseñar los principales elementos de la programación en Perl.

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
      1. if <i>expr</i> {
      2. (...)
      3. } elsif <i>expr</i> {
      4. (...)
      5. } else {
      6. (...)
      7. }
    • (...) if <i>expr</i>
    • unless
    • <i>expr</i> and (...)
    • <i>expr</i> or (...)
    • <i>expr</i> ? (...) : (...)
  • Ciclos
      1. while (<i>expr</i>) {
      2. (...)
      3. }
      1. until (<i>expr</i>) {
      2. (...)
      3. }
      1. do {
      2. (...)
      3. }while/until
      1. for (<i>expr1</i> ; <i>expr2</i> ; <i>expr3</i>) {
      2. (...)
      3. }
      1. foreach <i>$var</i> (<i>lista</i>) {
      2. (...)
      3. }
  • 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: &quot;...&quot;, 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:
      1. $var = 'valor';
      2. 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
      • BEGIN
      • END
      • Método DESTROY
    • Interacción con CGI
    • Interacción con bases de datos
    • Programación orientada a redes con sockets