Perl

Manual Perl - Introducción

Introducción a Perl 5.10

Nota: Este documento está basado en Beginner's Introduction to Perl, de  Doug Sheppard's, y en la introducción a Perl existente en el sitio oficial.

Bienvenido a Perl.

Perl es la navaja suiza de los lenguajes de programación: potente y adaptable. Fué desarrollado inicialmente por Larry Well, un lingüista que estuvo trabajando como administrador de sistemas para la NASA a finales de los años 80, para simplificar el proceso de informes. Desde entonces, su uso se ha extendido a otras áreas: automatización de la administración de sistemas, para integración entre sistemas operativos diferentes, programación web, bioinformática, e incluso desarrollo de aplicaciones. 

Por qué se hizo Perl tan popular cuando llegó la Web ? Hay dos razones: En primer lugar, casi todo lo que se hace en la web implica el proceso de texto, y la mejor manera de hacer esto es con un lenguaje diseñado para el proceso de texto. Aún más importante, Perl era notablemente mejor que las alternativas existentes cuando fué creado. El lenguaje C es complicado, y puede producir problemas de seguridad (sobre todo con datos no fiables). Tcl puede ser engorroso, y Python no estaba realmente introducido.

Tampoco era malo el hecho de que Perl es un lenguage 'amistoso'. El slogan de Perl es "Hay más de una manera de hacerlo", y esto se aplica tanto a problemas grandes como a los pequeños. Por último, Perl es muy portable y está muy extendido - Está disponible preinstalado casi en cualquier sitio -- I por supuesto hay miles de bibliotecas de funciones de libre distribución disponibles en el CPAN.

En esta introducción, aprenderemos lo más básico de Perl, y veremos algunos pequeños programas de ejemplo.

Sistemas Operativos

En esta documentación se supone que el lector está utilizando un sistema operativo Unix o similar (Linux, Mac OS X o Cygwin), y que el binario del intérprete de Perl se encuentra en  /usr/bin/perl. También es válido si se está utilizando Perl sobre Windows mediante ActivePerl o Strawberry Perl; casi todo el código Perl es independiente de la plataforma.

Tu primer programa Perl

Guarda este programa en un archivo llamado first.pl:

use feature ':5.10';
say "Hola, que tal!";

Ejecuata el programa. Desde la línea de comandos, ve al directorio que contiene el archivo y teclea perl first.pl. Deberías ver:

Hola, que tal!

Seguro que puedes imaginar lo que hace say. Y la línea use feature ':5.10'; ? De momento, todo lo que necesitas saber es que te permite utilizar las nuevas características disponibles en Perl 5.10.

Funciones y sentencias

Perl tiene una amplia colección de funciones incorporadas. Estas funciones son los comandos que ejecuta el intérprete. Se puede ver una relación te todas las funciones incorporadas en la página de manual perlfunc (perldoc perlfunc, desde la línea de comandos). Casi todas las funciones pueden recibir una lista de parámetros separados por comas.

La función print es una de las más frecuentemente usadas de Perl. Se utiliza para imprimir cosas en pantalla, o enviar información a un fichero. Recibe como parámetros una lista de cosas que imprimir. 

print "This is a single statement."; print "Look, ", "a ", "list!";

Un programa Perl consiste en sentencias, cada una de las cuales finaliza en un carácter ';' . Las sentencias no tienen por qué estar en lineas distintas; puede haber varias sentencias en una misma linea. También se puede escribir una sola sentencia en varias líneas.

print "This is "; print "two statements.\n"; print "But this ", "is only one statement.\n";

Cuál es la diferencia entre say y print? Qué sentido tienen los caracteres \n en las sentencias print?

La función say se comporta como la función print, con la diferencia de que añade un salto de línea al final. La función print sólo imprime los argumentos que recibe, sin añadir nada. Si se quiere añadir un salto de línea, hay que hacerlo explicitamente con la secuencia de escape \n. 

use feature ':5.10';  say "This is a single statement."; say "Look, ", "a ", "list!";

Números, cadenas de texto y comillas

Hay dos tipos de datos básicos en Perl: Números y cadenas de texto (strings).

Un string es una colección de caracteres entres comillas simples o dobles:

'This is a test.' "Hi there!\n"

Cuando se utilizan comillas dobles, el contenido del strings es interpretado. Así, en el string "Hola \n adios", la secuencia de escape \n se transforma en el carácter salto de línea, mientras que en el string 'Hola \n adios', se mantienen los caracteres \ y n.

use feature ':5.10'; say "This string\nshows up on two lines."; say 'This string \n shows up on only one.';

Otras secuencias de escape útiles son \t para insertar un carácter tabulador, y \\ para insertar un caracter '\'.)

Variables

Si las funciones son los verbos de Perl, entonces las variables son los sustantivos. Perl tiene tres tipos de variables: escalares, arrays y hashes. En Perl, todos los nombres de variable conosisten en un signo de puntuación, una letra o el carácter '_' (guión bajo, subrayado, underscore), y uno o más caracteres alfanuméricos o signos '_'.

Los escalares son variables simples (un número o un string). El nombre de una variables escalar comienza con el signo $. Para asignar un valor a un escalar, se utiliza el signo '=':

my $i                = 5;
my $pie_flavor = 'apple';
my $constitution1776 = "We the People, etc.";

No es necesario especificar si la variable es un número o un string. Perl realiza la conversión entre número y string automáticamente, cuando es necesario.

 Si se utiliza una cadena de texto entre comillas dobles, Perl inserta el valor de cualquier variable escalar que se encuentre en el interior de la cadena:

use feature ':5.10'; my $apple_count  = 5; 
my $count_report = "There are $apple_count apples.";
say "The report is: $count_report";

El código precedente genera la siguiente salida: The report is: There are 5 apples..

Se pueden manipular números en Perl con los operadores +, - ,* y /: 

my $a = 5; my $b = $a + 10;       # $b is now equal to 15. 
my $c = $b * 10; # $c is now equal to 150.
$a = $a - 1; # $a is now 4, and algebra teachers are cringing.

Pero qué significa la palabra my que aparece en algunas sentencias de asignación ? El operador my se utiliza para declarar una nueva variable.

También se pueden utilizar los operadores especiales ++, --, +=, -=, /= and *=. Estos operadores manipulan un único valor escalar:

my $a = 5; $a++;        # $a is now 6; we added 1 to it. 
$a += 10; # Now it's 16; we added 10.
$a /= 2; # And divided it by 2, so it's 8.

En cuanto a los strings, el único operador básico que admiten es el de concatenación, que se representa con un punto '.':

my $a = "8";    # Como está entre comillas,  $a es una cadena. 
my $b = $a + "1"; # "1" también es una comilla, pero el valor de $b es el número 9.
my $c = $a . "1"; # El valor de $c es la cadena "81"

Las variabless de tipo Array son secuencias de variables escalares. Los nombres de los arrays comienzan con el carácter @. Los arrays se definen listando, entre paréntesis y separados por comas, los valores que contienen:

my @lotto_numbers = (1, 2, 3, 4, 5, 6);  # Hey, it could happen. 
my @months = ("July", "August", "September");

Para obtener al valor de una determinada posición del array, se especifica entre corchetes '[' y ']' su índice. Los índices en Perl comienzan por cero. En este caso, se sustituye el signo '@' del array por el signo '$'. Del mismo modo, se puede modificar el valor de una posición del array:

use feature ':5.10';  
my @months = ("July", "August", "September");
say $months[0]; # This prints "July".
$months[2] = "Smarch"; # We just renamed September!

Si una posición del array no existe, Perl la crea cuando se le asigna por primera vez un valor:

my @winter_months = ("December", "January"); 
$winter_months[2] = "February";

Para saber el número de elementos de que consta un array, se asigna el array a un escalar:

use feature ':5.10'; 
my @months = ("July", "August", "September");
my $month_count = @months; say $month_count; # This prints 3.
my @autumn_months; # no elements
my $autumn_count = @autumn_months;
say $autumn_count; # this prints 0

Las variables de tipo hash contienen una colección de pares (clave => valor). Los nombres de variables de tipo hash comienzan por el signo '%'. Una variable de tipo hash se inicializa especificando, entre paréntesis y separados por comas, los pares clave => valor de que consta:

my %days_in_month = ( "July" => 31, "August" => 31, "September" => 30 );

Para obtener de una variable de tipo hash el valor asociado a una determinada clave, se utiliza la sintaxis $hashname{key}. Del mismo modo se puede modificar el valor asociado a una clave:

say $days_in_month{September}; # 30, of course. 
$days_in_month{February} = 29; # It's a leap year.

Para saber qué claves existen en una hash, se utiliza la funcion keys. Esta función devuelve una lista que contiene todas las claves del hash. 

Nota: El orden en que aparecen las claves en la lista puede variar entre una ejecución de la función keys y la siguiente.

my @month_list = keys %days_in_summer; # @month_list is now ('July', 'September', 'August')!

Los tres tipos de variables tienen tres namespaces diferenciados. Esto quiere decir que  $abacus y @abacus son dos variables distintas, y que  $abacus[0] (el primer elemento de @abacus) no es lo mismo que  $abacus{0} (el valor en %abacus asociado a la clave 0).

Comentarios

Algunos de los ejemplos presentados contienen comentarios. Los comentarios se añaden precediéndolos del signo #, a continuación de una sentencia. 

use feature ':5.10'; say "Hello world!";  # That's more like it. # This entire line is a comment.

Bucles

Casi cualquier programa utiliza un bucle de algún tipo. Los bucles permiten ejecutar un bloque de código un número variables de veces, mientras se cumple determinada condición. 

La función más básica en Perl para el control de flujo es for . Para utilizarla, se especifica una variable como el índice del bucle, y una lista de valores entre paréntesis y separados por comas. El código a ejecutar se especifica a continuación entre llaves. En cada ejecución del código, la variable asume en secuencia cada uno de los valores:

use feature ':5.10';  for my $i (1, 2, 3, 4, 5) {      say $i; }

Para especificar los valores, también se puede utilizar el operador rango ..

use feature ':5.10';  
my @one_to_ten = (1 .. 10);
my $top_limit = 25;
for my $i (@one_to_ten, 15, 20 .. $top_limit) { say $i; }

Los valores que se especifican para la variable índice no tienen que ser números. Si la hash %month_has contiene nombres de meses y el número de días de cada mes, se puede utilizar la función keys para recorrerlos:

use feature ':5.10';  
for my $i (keys %month_has) {
say "$i has $month_has{$i} days.";
}
for my $marx ('Groucho', 'Harpo', 'Zeppo', 'Karl') {
say "$marx is my favorite Marx brother.";
}

El milagro del interés compuesto

You now know enough about Perl -- variables, print/say, and for() -- to write a small, useful program. Everyone loves money, so the first sample program is a compound-interest calculator. It will print a (somewhat) nicely formatted table showing the value of an investment over a number of years. (You can see the program at compound_interest.pl)

The single most complex line in the program is:

my $interest = int( ( $apr / 100 ) * $nest_egg * 100 ) / 100;

$apr / 100 is the interest rate, and ($apr / 100) * $nest_egg is the amount of interest earned in one year. This line uses the int() function, which returns the integer value of a scalar (its value after any stripping off any fractional part). We use int() here because when you multiply, for example, 10925 by 9.25%, the result is 1010.5625, which we must round off to 1010.56. To do this, we multiply by 100, yielding 101056.25, use int() to throw away the leftover fraction, yielding 101056, and then divide by 100 again, so that the final result is 1010.56. Try stepping through this statement yourself to see just how we end up with the correct result, rounded to cents.

Pónlo en práctica!

At this point you have some basic knowledge of Perl syntax and a few simple toys to play with. Try writing some simple programs with them. Here are two suggestions, one simple and the other a little more complex:

  • A word frequency counter. How often does each word show up in an array of words? Print out a report. (Hint: Use a hash to count of the number of appearances of each word.)
  • Given a month and the day of the week that's the first of that month, print a calendar for the month.