Perl está disponible para múltimples plataformas, pueden descargarlo desde acá o desde el sistema de paquetes que utilicen. Para verificar si tienen instalado perl, en la terminal escriban perl -v, si hay salida ya lo tienen instalado.
Para la instalación de librerías se utiliza CPAN, que es una colección de módulos libres para Perl. Pueden descargar este script o sino instalarlo desde los repositorios, por ejemplo, en un Linux basado en Debian basta correr:
1aptitude install cpanminus
Una vez instalado, para instalar módulos deben correr desde la consola el siguiente comando (teniendo en cuenta que el nombre del módulo es case-sensitive):
1cpan install Modulo
Variables
Perl maneja tres tipos de variables:
Scalar
Las variables escalares representan un valor simple. Los valores escalares pueden ser cadenas, enteros o números de coma flotante y se definen anteponiendo el signo $ al nombre de la variable. No hay necesidad de pre-declarar sus tipos de variables, Perl los convertirá automáticamente entre ellos según sea necesario.
1my $animal = "turtle";2 my $answer = 42;
Array
Las variables de tipo Array representan una lista de valores. Se declaran anteponiendo el signo @ al nombre de la variable
1my @animals = ("turtle", "llama", "cat");2 my @numbers = (23, 42, 69);3 my @mixed = ("whale", 666, 1.23);
Los Arrays son indexados a cero. Se puede acceder a los valores de la siguiente manera:
1print $animals[0]; # imprime "turtle". Se utiliza $ porque es un valor scalar2 print $animals[1]; # imprime "llama"
La variable especial $#nombrearray nos indica el índice del último elemento.
1print $#mixed; # imprime 22 print $mixed[$#mixed]; # último elemento, imprime 1.23
Si utilizamos @mixed en contexto escalar, obtendremos el tamaño de nuestro Array:
1$arrayLength = @mixed;2 print $arraylength; #imprime 3
Para obtener múltiples valores de nuestro Array:
1@animals[0,1]; # Devuelve ("turtle", "llama"), @ porque devuelve un array;2 @animals[0..2]; # Devuelve ("turtle", "llama", "cat");3 @animals[1..$#animals]; # Devuelve todo excepto el primer elemento
Hash
Un hash representa un conjunto de pares clave / valor. En realidad hash son tipo de Arrays, con la excepción de que el índice puede ser un número o una cadena. Están precedidos por el signo % de la siguiente manera:
1my %fruit_color = ("apple", "red", "banana", "yellow");
Se pueden utilizar los espacios en blanco y el operador => para dejarlo mas claro:
1my %fruit_color = (2 apple => "red",3 banana => "yellow",4 );
Para obtener un elemento del hash:
1$fruit_color{"apple"} # Devuelve "red"
Podemos obtener una lista con las claves o valores con las funciones predefinidas keys() y values():
1my @frutas = keys(%fruit_color);2 my colores = values(%fruit_color);
Alcance de las variables
En la sección anterior declaramos:
1my $animal = "turtle";
El modificador my no es necesario, también se puede usar:
1$animal = "turtle";
Sin embargo, el uso anterior creará variables globales a través de su programa, que es mala práctica de programación. my crea variables con ámbito local. Las variables locales están disponibles en el ámbito del bloque (es decir, un grupo de estados rodeadas de llaves) en el que están definidos.
1my $x = "foo";2 my $condicion = 1;3 if ($condicion) {4 my $y = "bar";5 print $x; # imprime "foo"6 print $y; # imprime "bar"7 }8 print $x; # imprime "foo"9 print $y; # no imprime nada ; $y no está en ese scope
Tabla de conversiones de tipos
(1,2,3) | [1,2,3] | {a=>x} | (a=>1) | "pepe" | |
---|---|---|---|---|---|
Arity | Lista | Scalar | Hash Ref. | Hash | Scalar |
Elemento | $x[0] | $x->[1] | $x->{a} | $x{a} | $x |
Lista | @x | @{$x} | %{$x} | %x | ($x) |
Hash | %{$x} | %x | {e=> $x} | ||
Ref. | \@x | $x | $x | \%x | \$x |
Ref. Copia | [@x] | [@{$x}] | {%{$x}} | {%x} | [$x] |
Sintaxis básica if, elsif, else, unless
1# La sintaxis es muy similar a otros lenguajes2 if ($var == 3) {3 do_magic();4 }56 # unless se usa para un if negativo7 if (!$var) {8 do_magic();9 }10 unless ($var) {11 do_magic();12 }1314 # Por supuesto también existe else15 if ($var) {16 do_magic();17 } else {18 do_another_magic();19 }20 # y se pueden anidar21 if ($var) {22 do_magic();23 } elsif ($another_var) {24 do_another_magic();25 } else {26 do_something_else();27 }
while, do while, until
1my $counter = 10;23 while ($counter > 0) {4 say $counter;5 $counter -= 1;6 }78 do {9 say $counter;10 $counter += 1;11 } while ($counter < 10);1213 until( $counter > 20 ){14 say "$counter";15 $counter += 1;16 }1718 say 'tadaaa';
for, for each
1# for ( init; condition; increment )2 for( $i = 1; $i < 20; $i = $i + 1 ){3 print "value: $i\n";4 }56 my @list = (1, 20, 33, 45, 59);7 foreach $i (@list){8 say '$i';9 }
Funciones En realidad las funciones son subrutinas, quizás sea porque el lenguaje es viejo :P ... la sintáxis es también bastante común.
1sub name{2 # blablabla3 return $x;4 }
Para pasar parámetros se hace de esta forma
1sub TestScalar{2 my $x = @_; #parámetro scalar3 # blabla4 }5 sub TestArray{6 my @list = @_; #parámetro array7 # blabla8 }9 sub TestHash {10 my (%hash) = @_; #parámetro hash11 # blabla12 }1314 # Si esperamos varios parámetros, se pueden acceder15 # desde la variable @_ como un array16 sub TestScalar{17 my $x = @_[0];18 my $y = @_[1];19 # blabla20 }
Variables privadas
1sub TestPrivateVars{2 my $var; # inaccesible fuera de TestPrivateVars()3 $varx; # accesible fuera de TestPrivateVars(), no hacerlo45 my ($another, @my_array, %my_hash); # declaración múltiple privada6 }
TDD con Perl
Para hacer TDD en necesario bajar un paquete de CPAN, Test::More.
Acá un ejemplo de como correr un test, sobre una función específica.
1# En esta línea declaramos el uso de Test::More2 # y le decimos que solo se corre una vez3 use Test::More test => 1;45 # is() es la función que ejecuta el test, consta de 3 parámetros6 # 1ro función a ejecutar con sus respectivos parámetros7 # 2do resultado esperado8 # 3ro nombre descriptivo9 is(replace("hola"), "chau", "Reemplazo de nombres");10 is(replace("chay"), "chau", "Reemplazo de nombres");1112 # Esta es la función que se ejecuta13 sub replace( my ($text) = @_;14 $text =~ s/\bhola\b/chau/gi;15 return $text;16 }1718 #Con esta función declaramos el fin del testing19 done_testing()