The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NOMBRE

perlintro -- Breve introducción y descripción general de Perl

DESCRIPCIÓN

Este documento proporciona una introducción rápida al lenguaje de programación Perl e incluye referencias a documentación adicional. Es una guía de iniciación para los nuevos usuarios del lenguaje que proporciona la información necesaria para poder leer el código Perl de otras personas y comprender a grandes rasgos su funcionamiento, o para escribir scripts sencillos.

Es un documento introductorio, no una guía completa. Tampoco explica el lenguaje en detalle. En algunos casos se ha sacrificado la precisión para transmitir la idea general. Es muy recomendable complementar esta introducción con información del manual de Perl completo, cuya tabla de contenido se encuentra en perltoc.

En este documento se incluyen referencias a otras partes de la documentación de Perl. Puede consultar la documentación mediante el comando perldoc o cualquier otro método que use para leer este documento.

En la documentación de Perl se incluyen muchos ejemplos que ilustran las características descritas. Tenga en cuenta que muchos de estos ejemplos son fragmentos de código, no programas completos.

Los ejemplos de las distintas partes de la documentación reflejan el estilo y las preferencias de sus autores, y pueden ser más escuetos que una línea de código equivalente en un programa real. Salvo si se indica lo contrario, debe suponer que al principio del "programa" se incluyen las instrucciones use strict y use warnings, y que todas las variables han sido declaradas, aunque se omitan las declaraciones para facilitar la lectura del ejemplo.

Tenga en cuenta que los ejemplos han sido escritos por muchos autores distintos a lo largo de varias décadas. Por esta razón, habrá diversos estilos y técnicas, pero se ha procurado que en una misma sección los estilos no varíen demasiado. Ningún estilo es mejor que otro. No olvide que uno de los lemas de Perl es "Se puede hacer de varias maneras". Al fin y al cabo, en su vida profesional como programador se va a encontrar distintos estilos.

¿Qué es Perl?

Perl es un lenguaje de programación de propósito general desarrollado originalmente para la manipulación de texto y que, en la actualidad, se usa para una amplia gama de tareas, como administración de sistemas, desarrollo web, programación de red, desarrollo de interfaces gráficas de usuario, etc.

El lenguaje se diseñó para ser práctico (fácil de usar, eficaz, completo), más que estético (reducido, elegante, minimalista). Se caracteriza principalmente por su facilidad de uso (permite programar tanto de manera procedural como orientada a objetos (OO)), su magnífica capacidad para procesamiento de texto y por tener una de las colecciones de módulos de terceros más impresionantes del mundo.

En perl, perlfaq1 y en muchos otros sitios se incluyen definiciones de Perl. Esto refleja el hecho de que, aunque Perl tiene muchos públicos distintos, muchas personas piensan que merece la pena escribir sobre este lenguaje.

Ejecución de programas Perl

Para ejecutar un programa Perl desde la línea de comandos de Unix, use el siguiente comando:

    perl nombre_programa.pl

Como alternativa, puede colocar al principio del script la siguiente línea:

    #!/usr/bin/env perl

... y ejecutar el script como /ruta/script.pl. Por supuesto, antes deberá marcarlo como ejecutable con el comando chmod 755 script.pl (en Unix).

(En esta línea se supone que dispone del programa env. También puede especificar directamente la ruta de acceso a su ejecutable perl: #!/usr/bin/perl).

Para obtener más información e instrucciones para otras plataformas, como Windows y Mac OS, lea perlrun.

Red de seguridad

Por su diseño, Perl es un lenguaje muy indulgente. Sin embargo, para trabajar de manera más segura se recomienda iniciar cada programa con las líneas siguientes:

    #!/usr/bin/perl
    use strict;
    use warnings;

Estas dos líneas adicionales ordenan a perl que detecte diversos problemas comunes en el código. Comprueban cosas distintas, por lo que ambas deben ser incluidas. Un posible problema detectado por use strict; hará que el código se detenga inmediatamente, mientras que use warnings; (al igual que el modificador de línea de comandos -w) sólo mostrará una advertencia y dejará que el código se ejecute. Para obtener más información, consulte las páginas de manual correspondientes a strict y warnings.

Descripción general de la sintaxis básica

Un script o programa Perl consta de una o varias instrucciones. Estas instrucciones se escriben directamente en el script. Es decir, no es necesario utilizar una función main() ni nada similar.

Las instrucciones de Perl deben terminar con un signo de punto y coma:

    print "Hola a todos";

Los comentarios comienzan con un símbolo # y van hasta el final de la línea:

    # Esto es un comentario

El espacio en blanco no es significativo:

    print
        "Hola a todos"
        ;

... salvo cuando está entre comillas:

    # esto imprimirá un salto de línea en la mitad de la frase
    print "Hola
    a todos";

Las cadenas literales se pueden escribir entre comillas dobles o simples:

    print "Hola a todos";
    print 'Hola a todos';

Sin embargo las variables y los caracteres especiales, como los caracteres de nueva línea (\n), solo se "interpolan" con comillas dobles:

    print "Hola, $nombre\n";  # funciona correctamente
    print 'Hola, $nombre\n';  # imprime $nombre\n literalmente

No es necesario escribir los números entre comillas:

    print 42;

Puede escribir los argumentos de las funciones entre paréntesis u omitir los paréntesis, si lo prefiere. Solo son necesarios en algunos casos para aclarar la precedencia.

    print("Hola a todos\n");
    print "Hola a todos\n";

Encontrará información más detallada sobre la sintaxis de Perl en perlsyn.

Tipos de variables de Perl

En Perl hay tres tipos de variables principales: escalares, arrays y hashes.

Escalares

Un escalar representa un solo valor:

    my $animal = "camello";
    my $respuesta = 42;

Los valores escalares pueden ser cadenas, enteros o números de punto flotante, y Perl los convertirá de un tipo a otro cuando sea necesario. No es necesario predeclarar los tipos de las variables, pero éstas deben declararse con la palabra clave my la primera vez que se usan. (Éste es uno de los requisitos de use strict;.)

Los valores escalares se pueden usar de varias maneras:

    print $animal;
    print "El animal es $animal\n";
    print "El cuadrado de $respuesta es ", $respuesta * $respuesta, "\n";

Hay varios escalares "mágicos" con nombres que recuerdan conjuntos de signos de puntuación (o "ruido de señal"). Estas variables especiales se usan para diversos fines y se describen en perlvar. La única que tiene que conocer por ahora es $_, la "variable predeterminada". Se usa como argumento predeterminado de varias funciones de Perl y su valor se establece implícitamente en determinadas estructuras de bucle.

    print;          # imprime el contenido de $_ de manera predeterminada
Arrays

Un array representa una lista de valores:

    my @animales = ("camello", "llama", "búho");
    my @numeros = (23, 42, 69);
    my @mezcla   = ("camello", 42, 1.23);

El índice de un array empieza en cero. Para obtener los elementos de un array:

    print $animales[0];  # imprime "camello" en pantalla
    print $animales[1];  # imprime "llama" en pantalla

La variable especial $#array indica el índice del último elemento de un array:

    print $mezcla[$#mezcla];  # último elemento, imprime 1.23 en pantalla

Podría sentirse tentado de usar $#array + 1 para determinar el número de elementos de un array. No es necesario. Si utiliza @array donde Perl espera encontrar un valor escalar ("en contexto escalar"), obtendrá el número de elementos del array:

    if (@animales < 5) { ... }

Los nombres de los elementos que obtenemos del array empiezan por $ porque reciben valores individuales del array; si se pide un escalar, se obtiene un escalar.

Para obtener varios elementos de un array:

    @animales[0,1];  # devuelve ("camello", "llama");
    @animales[0..2];  # devuelve ("camello", "llama", "búho");
    @animales[1..$#animales];  # devuelve todos excepto el primero

Esto se denomina una "porción de array".

Puede hacer varias cosas útiles con las listas:

    my @ordenados    = sort @animales;
    my @orden_inverso = reverse @numeros;

También hay dos arrays especiales: @ARGV (los argumentos de línea de comandos pasados al script) y @_ (los argumentos pasados a una subrutina). Se describen en perlvar.

Hashes

Un hash representa un conjunto de pares clave-valor:

    my %color_fruta = ("manzana", "rojo", "plátano", "amarillo");

Puede usar espacio en blanco y el operador => para expresarlos de manera más clara:

    my %color_fruta = (
        manzana=> "rojo",
        plátano => "amarillo",
    );

Para obtener los elementos de un hash:

    $color_fruta{"manzana"};           # devuelve "rojo"

Puede obtener una lista de las claves y los valores con keys() y values() respectivamente.

    my @frutas = keys %colores_fruta;
    my @colores = values %colores_fruta;

En los hashes no hay un orden interno específico, aunque puede ordenar las claves antes de recorrerlas en un bucle.

De la misma manera que hay escalares y arrays especiales, también hay hashes especiales. El más conocido es %ENV, que contiene variables de entorno. Encontrará información sobre este hash (y sobre otras variables especiales) en perlvar.

Encontrará información detallada sobre los escalares, arrays y hashes en perldata.

Se pueden crear tipos de datos más complejos mediante referencias, que permiten generar listas y hashes dentro de listas y hashes.

Una referencia es un valor escalar que puede apuntar a cualquier tipo de datos de Perl. Así, almacenando una referencia como el valor de un elemento de array o hash, puede crear fácilmente listas y hashes dentro de listas y hashes. En el ejemplo siguiente se muestra una estructura de hash de hashes de 2 niveles en la que se usan referencias de hash anónimas.

    my $variables = {
        escalar  =>  {
                     descripcion => "elemento invidivual",
                     sigilo => '$',
                    },
        array   =>  {
                     descripcion => "lista ordenada de elementos",
                     sigilo => '@',
                    },
        hash    =>  {
                     descripcion => "pares clave-valor",
                     sigilo => '%',
                    },
    };

    print "Los escalares empiezan por $variables->{'escalar'}->{'sigilo'}\n";

Encontrará información detallada sobre las referencias en perlreftut, perllol, perlref y perldsc.

Ámbito de las variables

En todos los ejemplos de la sección anterior se utilizó esta sintaxis:

    my $var = "valor";

En realidad no es obligatorio usar my; se puede usar simplemente:

    $var = "valor";

Sin embargo, el uso anterior creará variables globales en todo el programa, algo que no se recomienda en programación. En cambio, my crea variables dentro de un ámbito léxico. El ámbito de las variables es el bloque (conjunto de instrucciones entre llaves) en el que se definen.

    my $x = "foo";
    my $una_condicion = 1;
    if ($una_condicion) {
        my $y = "bar";
        print $x;           # imprime "foo" en pantalla
        print $y;           # imprime "bar" en pantalla
    }
    print $x;               # imprime "foo" en pantalla
    print $y;               # no imprime nada; $y está fuera del ámbito

Si escribe use strict; al principio de los scripts de Perl y usa my, el intérprete detectará determinados errores frecuentes de programación. Así, en el ejemplo anterior, la última instrucción print $y provocará una error en tiempo de compilación que impedirá la ejecución del programa. Es muy recomendable usar strict.

Estructuras condicionales y de bucle

Perl ofrece las estructuras condiciones y de bucle habituales. En Perl 5.10, incluso ofrece una instrucción case/switch (llamada given/when). Consulte "Instrucciones switch" en perlsyn para obtener información detallada.

Una condición puede ser cualquier expresión Perl. Consulte la lista de operadores de la siguiente sección para obtener información sobre los operadores lógicos booleanos y de comparación que se suelen usar en instrucciones condicionales.

if
    if ( condición ) {
        ...
    } elsif ( otra condición ) {
        ...
    } else {
        ...
    }

También existe la versión negada:

    unless ( condición ) {
        ...
    }

Esto se proporciona como una versión más legible de if (!condición).

Tenga en cuenta que en Perl es obligatorio usar las llaves, aunque sólo haya una línea en el bloque. Sin embargo, puede escribir los bloques condicionales de una sola línea de manera que recuerden a una frase en inglés:

    # la manera tradicional
    if ($zippy) {
        print "¡Caramba!";
    }

    # ahora con una condición posterior, al estilo Perl
    print "¡Caramba!" if $zippy;
    print "No quedan plátanos" unless $platanos;
while
    while ( condición ) {
        ...
    }

Existe también una versión negada, por la misma razón que existe unless:

    until ( condición ) {
        ...
    }

También puede usar while en una condición posterior:

    print "LA LA LA\n" while 1;          # bucle sin fin
for

Exactamente igual que en C:

    for ($i = 0; $i <= $max; $i++) {
        ...
    }

El bucle for de C no se suele usar, ya que Perl proporciona una alternativa más sencilla para recorrer listas, el bucle foreach.

foreach
    foreach (@array) {
        print "Este elemento es $_\n";
    }

    print $lista[$_] foreach 0 .. $max;

    # tampoco tiene que usar la variable $_ predeterminada...
    foreach my $clave (keys %hash) {
        print "El valor de $clave es $hash{$clave}\n";
    }

Para obtener más información sobre las estructuras de bucle (y otras estructuras que no se han mencionado en esta introducción ), consulte perlsyn.

Funciones y operadores predefinidos

Perl incluye una amplia selección de funciones y operadores predefinidos. Ya hemos visto algunas funciones, como print, sort y reverse. Al principio de perlfunc se incluye una lista completa de funciones. También puede obtener fácilmente información sobre cualquier función mediante el comando perldoc -f nombre_función.

Encontrará información detallada sobre los operadores de Perl en perlop; algunos de los más comunes son:

Aritmética
    +   suma
    -   resta
    *   multiplicación
    /   división
Comparación numérica
    ==  igual que
    !=  distinto que
    <   menor que
    >   mayor que
    <=  menor o igual que
    >=  mayor o igual que
Comparación de cadenas
    eq  igual que
    ne  distinto que
    lt  menor que
    gt  mayor que
    le  menor o igual que
    ge  mayor o igual que

¿Por qué se usa un operador de comparación para números y otro para cadenas? Porque Perl no distingue el tipo del contenido de las variables y tiene que determinar si debe ordenar numéricamente (99 menor que 100) o alfabéticamente (100 es anterior a 99).

Lógica Booleana
    &&  and
    ||  or
    !   not

(En la tabla anterior and, or y not no son solo descripciones de los operadores. Son también operadores. Ofrecen más legibilidad que los operadores tipo C correspondientes, como &&, pero su precedencia es distinta. Consulte perlop para obtener más información.)

Otros operadores
    =   asignación
    .   concatenación de cadenas
    x   multiplicación de cadenas
    ..  operador de intervalo (crea una lista de números)

Muchos operadores se pueden combinar con un signo = de la manera siguiente:

    $a += 1;        # igual que $a = $a + 1
    $a -= 1;        # igual que $a = $a - 1
    $a .= "\n";     # igual que $a = $a . "\n";

Archivos y E/S

La función open() abre un archivo para entrada o salida. Esta función se describe de forma muy detallada en perlfunc y perlopentut. A continuación se muestra un resumen de cómo se usa:

    open(my $entrada,  "<",  "entrada.txt")  or die "No se puede abrir entrada.txt: $!";
    open(my $salida, ">",  "salida.txt") or die "No se puede abrir salida.txt: $!";
    open(my $registro, ">>", "mi.registro")     or die "No se puede abrir mi.registro: $!";

Puede utilizar el operador <> para leer de un identificador de archivo abierto. En contexto escalar, este operador lee una sola línea del identificador de archivo, mientras que en contexto de lista lee todo el archivo y asigna cada línea a un elemento de la lista:

    my $linea  = <$entrada>;
    my @lineas = <$entrada>;

La lectura de un archivo completo se suele llamar "slurping" (succión). Puede resultar útil, pero esta operación consume mucha memoria. Gran parte de las tareas de procesamiento de archivos de texto se puede hacer de línea en línea con las estructuras de bucle de Perl.

El operador <> se suele utilizar en un bucle while:

    while (<$entrada>) {     # asigna una línea cada vez a $_
        print "Acabo de leer esta línea: $_";
    }

Ya hemos visto la manera de imprimir en la salida estándar mediante print(). Sin embargo, print() también puede consumir un primer argumento opcional que especifique el identificador de archivo en el que se debe imprimir:

    print STDERR "Ésta es la última advertencia.\n";
    print $salida $registro;
    print $registro $mensaje_registro;

Cuando termine de trabajar con los identificadores de archivo, debe cerrarlos con close() (de todos modos, Perl se encargará de ello si se le olvida):

    close $entrada or die "$entrada: $!";

Expresiones regulares

El soporte de Perl para las expresiones regulares es amplio y profundo, y se describe en gran detalle en los documentos perlrequick y perlretut, entre otros. Se incluye a continuación un resumen:

Detección de coincidencias sencilla
    if (/foo/)       { ... }  # verdadero si $_ contiene "foo"
    if ($a =~ /foo/) { ... }  # verdadero si $a contiene "foo"

El operador de detección de coincidencias // se describe en perlop. Opera en $_ de manera predeterminada, o se puede enlazar a otra variable con el operador de enlace =~ (que también se describe en perlop).

Sustitución simple
    s/foo/bar/;  # reemplaza foo por bar en $_
    $a =~ s/foo/bar/;  # reemplaza foo por bar en $a
    $a =~ s/foo/bar/g;  # reemplaza todas las coincidencias de foo por bar en $a

El operador de sustitución, s///, se describe en perlop.

Expresiones regulares más complejas

No tiene que limitarse a detectar coincidencias en cadenas fijas. De hecho, puede detectar coincidencias donde quiera con expresiones regulares más complejas. Estas se describen de forma detallada en perlre. A continuación se incluye una guía rápida:

    .                   un solo carácter
    \s                  un espacio en blanco (espacio, tabulación, nueva línea, ...)
    \S                  un carácter que no sea un espacio en blanco
    \d                  un dígito (0-9)
    \D                  un carácter que no sea un dígito
    \w                  un carácter de palabra (a-z, A-Z, 0-9, _)
    \W                  un carácter que no sea de palabra
    [aeiou]             un solo carácter del conjunto especificado
    [^aeiou]            un solo carácter no perteneciente al conjunto especificado
    (foo|bar|baz)       cualquiera de las alternativas especificadas

    ^                   principio de una cadena
    $                   final de una cadena

Los cuantificadores se utilizan para especificar cuántas coincidencias de lo anterior (un carácter literal, uno de los metacaracteres antes especificados o un grupo de caracteres o metacaracteres entre paréntesis) se desea detectar.

    *                   cero o más coincidencias de lo anterior
    +                   una o más coincidencias de lo anterior
    ?                   cero o una coincidencias de lo anterior
    {3}                 detecta exactamente 3 coincidencias de lo anterior
    {3,6}               detecta entre 3 y 6 coincidencias de lo anterior
    {3,}                detecta 3 o más coincidencias de lo anterior

Algunos ejemplos breves:

    /^\d+/              cadena que empieza por uno o varios dígitos
    /^$/                cadena vacía (principio y final contiguos)
    /(\d\s){3}/         tres dígitos, cada uno seguido de un espacio
                (p. ej. "3 4 5 ")
    /(a.)+/             cadena en la que cada letra impar
                        es "a" (p. ej., "abacadaf")

    # Este bucle lee de STDIN e imprime las líneas que no estén vacías:
    while (<>) {
        next if /^$/;
        print;
    }
Paréntesis de captura

Además de para agrupar, los paréntesis también se pueden usar para capturar los resultados de partes de una expresión regular a fin de usarlos posteriormente. Los resultados se almacenan en $1, $2, etc.

    # manera rápida de descomponer una dirección de correo electrónico

    if ($email =~ /([^@]+)@(.+)/) {
        print "El nombre de usuario es $1\n";
        print "El nombre de host es $2\n";
    }
Otras características de las expresiones regulares

Las expresiones regulares de Perl también ofrecen referencias a capturas previas, inspección hacia adelante, y muchas otras funcionalidades complejas. Encontrará más información en perlrequick, perlretut y perlre.

Programación de subrutinas

Es fácil escribir subrutinas:

    sub registrador {
        my $mensaje_registro = shift;
        open my $registro, ">>", "mi.registro" or die "No se pudo abrir mi.registro: $!";
        print $registro $mensaje_registro;
    }

Ahora podemos usar la subrutina como cualquier función integrada:

    registrador("Tenemos una subrutina para registrar.");

¿Qué hace shift? Los argumentos pasados a una subrutina están disponibles en un array especial denominado @_ (consulte perlvar para obtener más información). El argumento predeterminado de la función shift es @_. Así, my $mensaje_registro= shift; quita el primer elemento de la lista de argumentos y se lo asigna a $mensaje_registro.

También podemos manipular @_ de otras maneras:

    my ($mensaje_registro, $prioridad) = @_; # común
    my $mensaje_registro = $_[0];            # poco común (y poco estético)

Las subrutinas también pueden devolver valores:

    sub cuadrado {
        my $num = shift;
        my $resultado = $num * $num;
        return $resultado;
    }

Puede asignar el valor devuelto así:

    $sq = cuadrado(8);

Para obtener más información sobre cómo escribir subrutinas, consulte perlsub.

Perl orientado a objetos

La programación orientada a objetos en Perl es relativamente sencilla y se implementa con referencias que "conocen" qué tipo de objeto son, basándose en el concepto de paquetes de Perl. Sin embargo, este tema queda fuera del ámbito de este documento. Lea perlboot, perltoot, perltooc y perlobj para obtener más información.

La aplicación que suelen hacer los programadores principiantes de la programación orientada a objetos en Perl es la utilización de módulos de terceros, que se describe a continuación.

Utilización de módulos de Perl

No pierda tiempo reinventando la rueda. Los módulos de Perl disponibles en CPAN ( http://www.cpan.org/) proporcionan funcionalidad que puede utilizar en sus programas. La distribución de Perl incluye muchos módulos populares.

Las categorías de módulos abarcan desde la manipulación de texto hasta protocolos de red, integración de bases de datos o gráficos. En CPAN también está disponible una lista de módulos clasificados por categorías.

Para aprender a instalar los módulos que descargue de CPAN, lea perlmodinstall.

Para aprender a usar un módulo específico, ejecute perldoc Nombre::Módulo. Normalmente agregará a su programa la línea use Nombre::Módulo, que le proporcionará acceso a las funciones exportadas o a una interfaz orientada a objetos del módulo.

perlfaq contiene preguntas y respuestas relacionadas con muchas tareas comunes, y en muchos casos sugiere los módulos de CPAN adecuados para cada tarea.

En perlmod se describen los módulos de Perl en general. perlmodlib enumera los módulos incluidos en la instalación de Perl.

Si desea escribir módulos de Perl, perlnewmod le ayudará a empezar.

AUTOR

Kirrily "Skud" Robert <skud@cpan.org>

TRADUCTORES

  • Joaquín Ferrero (Tech Lead), explorer + POD2ES at joaquinferrero.com

  • Enrique Nell (Language Lead), blas.gordon + POD2ES at gmail.com

1 POD Error

The following errors were encountered while parsing the POD:

Around line 3:

Non-ASCII character seen before =encoding in 'introducción'. Assuming CP1252