CaFe.pm - Perl Mongers de Capital Federal

Inicio | Miembros | Reuniones | Boletines | Reviews | Eventos | Documentos | Proyectos | Biblioteca | Recursos


Perl Básico : Sesión 1


Tutorial dado por Uriel Lizama (Julio de 2006) en el canal de IRC #perlenespanol de irc.freenode.org

Como primer tema de ésta sesión vamos a ver un poco de los inicios de Perl. No va a ser muy extenso pues es algo trivial, simplemente para entender un poco sus comienzos.

Muy bien, antes que nada el lenguaje se llama Perl, solamente la primera P se pone en capitulares. Tradicionalmente el programa que ejecuta los scripts de Perl se llama perl, todo en minúsculas. Esto nos servirá para más adelante diferenciar entre el lenguaje y el programa.

El lenguaje Perl toma su nombre de Practical Extraction and Report Language y fue ideado por Larry Wall. La primera versión sale en el año de 1987. Originalmente Larry Wall lo describe como un excelente lenguaje optimizado para leer archivos de texto, extraer información de esos archivos y crear reportes basados en esa información, combinando lo mejor de C, sed, awk y sh. Para los que conocen alguno de los lenguajes y herramientas antes mencionados, se podrán dar cuenta que la sintáxis del lenguaje es muy similar y no tendrán mucho problema en adoptarlo.

Perl se considera un lenguaje interpretado, es decir, no es necesaria una previa compilación para poder ejecutarse, lo único que se necesita es darle al interprete, perl, el código que queremos que ejecute. Desde sus inicios Perl ha avanzado mucho y ahora se encuentra en la versión 5 con la versión 6 en pleno desarrollo. Cabe mencionar que Perl hoy en día es usado para una gran variedad de cosas, desde avanzados programas de seguridad hasta sencillos CGIs para administrar formularios. Uno de los fuertes de Perl es la existencia de CPAN, un directorio de módulos que podemos integrar a nuestros scripts para facilitarnos la vida.

CPAN es definitivamente uno de los íconos representativos de Perl otros lenguajes (proyectos) han querido implementar algo similar... pero han fallado Perl lleva a CPAN desde su nacimiento... la filosofía comunitaria de Perl ha hecho de CPAN lo que es ahora... es el centro de distribución comunitario de paquetes que ningún otro lenguaje ha tenido sin duda, CPAN representa todo el trabajo que la comunidad de Perl ofrece, y que a su vez, es una excelente manera de contribuir con algo.

Muy bien, esto es el inicio de Perl, y con ello podemos entender un poco más éste bello lenguaje,


LAS VARIABLES

Éste es nuestro primer tema, y en él vamos a hablar de la pieza fundamental de cualquier lenguaje de programación, las variables.


¿Qué es una variable?

Una variable como bien dice su nombre es algo que puede variar Al nosotros hacer un script no tenemos manera de saber toda la información que vamos a tener, ya sean resultados de sumas, entradas de datos, etc Para ello usamos las variables, para almacenar todos esos datos En Perl hay varios tipos de variables, y les vamos a hechar un vistazo a las mismas


Las Escalares ($variable)

En Perl la variable básica es la escalar. Ésta variable puede contener cualquier tipo de información ya sean números, letras, cadenas de texto, signos, código ASCII, etc así como cosas más avanzadas como referencias que veremos más adelante.

Para definir una variable escalar todo lo que tenemos que hacer es:

$variable

El símbolo $ se usa para identificar a nuestra variable, y después podemos usar el nombre que queramos. Para nombrar nuestras variables debemos de seguir un par de reglas: El nombre de nuestras variables únicamente pueden nombrarse con valores alfanúmericos. El nombre de nuestras variables son sensibles al uso de mayúsculas y minúsculas, esto significa que las variables $variable y $Variable son dos variables distintas. Al definir nuestra variables es buen hábito usar el keyword my Otro punto importante es que las variables NO puden comenzar con números Solamente letras o _ ya después se puede usar cualquier cáracte alfanúmerico Muy bien, ahora veamos como podemos definir una variable e iniciarla con un valor:

my $numero = 10;

También podemos definirla primero, y después inicializarla:

my $numero;
$numero = 10;

En ambos casos nuestra variable terminará con el valor 10. Podemos asignar el valor de una variable a otra, por ejemplo:

1 my $variableA = "Mi Variable"; 2 3 my $variableB = $variableA; 4 5 my $variableC; 6 7 $variableC = $variableA;

En la línea 1 definimos e inicializamos la variable $variableA con el valor Mi Variable. Luego en la línea 3 definimos e inicializamos la variable $variableB con el valor de $variableA de ésta manera ambas variable tendrán el mismo valor. Y en las líneas 5 y 7, definimos la variable, e inicializamos la variable en dos pasos distintos. En este momento podremos ver que cada línea de código de Perl debe de acabar con un ;


Los Arrays (@array)

Ahora veamos el siguiente tipo de variable de Perl. Los arrays o arreglos como se les puede llamar en español no son exactamente vectores, más que nada se les puede definir como una lista de cosas, estás cosas pueden ser números, letras, palabras o hasta variables. Este tipo de variable es un punto sumamente fuerte de Perl y que te verás usando más de una vez en tus scripts. Nuestro array se define de la siguiente manera

my @array;

Vemos que debemos de usar el símbolo @ para definir nuestros arrays. Como los arrays son listas de cosas, es diferente la manera en que los inicializamos

my @array = ('Perro','Gato','Gallina','Pez');

Aquí definimos e inicializamos nuestra variable,
para definir la lista con la que queremos inicializar a nuestro array, ponemos todos los elementos de la lista entre paréntesis y separando cada elemento por una coma. Aquí como cada elemento de la lista es una cadena de texto, por eso los ponemos entre comillas sencillas, aunque también podrían ser comillas dobles La separación es por comas, así que no importa la cantidad de espacios que haya entre cada elemento, a continuación pongo un ejemplo:

1   my @array = (
2                'Perro',
3                'Gato',
4                'Gallina',
5                'Pez'
6               );

Ya que tenemos una lista de cosas cargadas dentro de nuestro array, ahora debemos de poder tomar alguno de estos elementos. A cada elemento dentro de nuestra lista le corresponde un número, basado en su posición dentro de la lista. Lo hay que tener en mente, es que Perl empieza a contar los elementos desde 0 NO desde 1. Por lo que en nuestro array con la lista de animales, el elemento 0 sería Perro y el elemento 1 sería Gato, así sucesivamente. Para tomar algún elemento de nuestra lista debemos de usar la siguiente sintáxis:

$array;

En donde es un número que corresponde al elemento que queremos tomar, veamos un ejemplo

1 my @array = ('Perro','Gato','Gallina','Pez');
2
3 my $animal = $array;

En la línea 1 definimos e inicializamos nuestro array, en la línea 3 asignamos el elemento 3 de nuestro array a la variable $animal ¿Saben cuál será el valor de nuestra variable $animal? Si pensaron Pez están en lo correcto


Los hashes (%hash)

Ahora vamos a ver las variable de tipo %hash de Perl. La variable hash o arreglo asociativo es un tipo de variable sumamente especial en Perl, ya que pocos lenguajes cuentan con variables de este tipo. El hash es un tipo de lista por medio de la cual podemos llamar a sus valores por medio de llaves. Así dependiendo de la llave que se llame será el valor que se retorne. Entenderemos esto más a fondo ahora que veamos unos ejemplos. El hash se define de la siguiente manera:

my %hash;

Vemos que el símbolo para diferenciar a las variables de tipo hash es el símbolo %. Ahora, como se explicó nuestro hash es una lista que corresponden a llaves y valores, Los hashes los podemos inicializar de dos mane;an con lo mismo


Operadores Lógicos

Los operadores lógicos normalmente los vamos a usar siempre que querramos controlar el flujo de nuestro programa, más adelante que veamos los Enunciados de Control veremos como.

1   op1 && op2   Operación AND
2   op1 || op2   Operación OR
3   !op1         Operación NOT

En sí es sencillo comprender que es un operador lógico, el programa va a realizar una desición en base a dos operandos cuya condición puede retornar verdadero o falso. Si en algún momento hemos tomado la materia de lógica en la escuela se nos será muy fácil comprender estos operadores. A continuación viene una tabla de resultados de los operadores, en la prímera columna viene el valor del operando1, en la segunda columna del operando2, y en la tercera y última columna el resultado en Verdadero o Falso.

1  RESULTADO &&
2   OP1     OP2     OP1 && OP2
3   0       0       0
4   1       0       0
5   0       1       0
6   1       1       1
7
8
9  RESULTADO ||
10  OP1     OP2     OP1 || OP2
11  0       0       0
12  1       0       1
13  0       1       1
14  1       1       1
15
16
17 RESULTADO !
18  OP1     !OP1
19  0       1
20  1       0

Operadores a Nível bit

op1 & op2 Este operador AND compara dos bits y retorna un resultado de 1 si ambos bits son 1, de lo contrario regresa 0.

op1 | op2 El operador OR compara dos bits y retorna un resultado de 1 si los bits son complementarios, de lo contrario regresa 0.

op1 ^ op2 El operador OR EXCLUSIVO compara dos bits y retorna un resultado de 1 si alguno o ambos bits son 1, de lo contrario retorna 0.

-op1 Este operador se usa para invertir todos los bits del operando.

op1 >> op2 El operador de DESPLAZAMIENTO A LA DERECHA mueve todos los bits a la derecha, se deshace del bit de la extrema derecha y asigna 0 al bit de la extrema izquierda, esto hace que cada movimiento divida a op1 a la mitad.

op1 << op2 El operador de DESPLAZAMIENTO A LA IZQUIERDA mueve todos los bits a la izquierda, se deshace del bit de la extrema izquierda y asigna 0 al bit de la extrema derecha, esto hace que cada movimiento multiplique a op1 en 2.

Ahí viene el listado de cada operador junto con su breve descripción Cabe destactar que estos operadores solamente funcionan con BITS


Operadores Relacionales Numéricos

Estos operadores se usan para verificar la relación que hay entre dos operadores númericos. Ya se igualdad, mayor o menor, etc

op1 == op2 Este operador retornará verdadero si ambos operadores son verdaderos. Por ejemplo, lo siguiente es verdadero: 7 == 7

op1 != op2 La contraparte del operador anterior, esto regresará verdadero si los operadores no son iguales. Por ejemplo, lo siguiente retornará verdadero: 6 != 7

op1 < op2 El operador retornará verdadero si op1 es menor a op2. Por ejemplo 2 < 6 es verdadero.

op1 <= op2 El operador retornará verdadero si op1 es menor o igual a op2. Por ejemplo 4 <= 4 y 4 <= 5 son verdaderos.

op1 > op2 El operador retornará verdadero si op1 es mayor a op2. Por ejemplo 6 > 5 es verdadero.

op1 >= op2 El operador retornará verdadero si op1 es mayor o igual a op2. Por ejemplo 8 >= 8 y 8 >= 4 son verdaderos.

op1 <==> op2 Este operador es algo diferente pues en vez de dos posible retornos, tiene 3. El operador retorna 1 si op1 es mayor a op2, 0 si op1 es igual a op2, y -1 si op1 es menor a op2.

Ahí viene la tabla con los operadores y una breve descripción


Operadores Relacionales de Cadena

Estos operadores se usan para verificar la relación entre dos operandos de cadena, los operandos de cadena se consideran aquellos que no son númericos.

op1 eq op2 El operador retornará verdadero si op1 es igual a op2. Por ejemplo c eq c es verdadero.

op1 ne op2 El operador retonará verdadero si op1 no es igual a op2. Por ejemplo a ne b es verdadero.

op1 lt op2 El operador retornará verdadero si op1 es menor a op2. Por ejemplo a lt b es verdadero.

op1 le op2 El operador retornará verdadero si op1 es menor o igual a op2. Por ejemplo a le b y a le a son verdaderos.

op1 gt op2 El operador retornará verdadero si op1 es mayor a op2. Por ejemplo z gt a es verdadero.

op1 ge op2 El operador retornará verdadero si op1 es mayor o igual a op2. Por ejemplo z ge y y z ge z son verdaderos.

op1 cmp op2 El operador tiene tres posible retornos. 1 si op1 es mayor a op2, 0 si op1 es igual a op2 y -1 si op1 es menor a op2.


Operador Ternario

El operador ternario es sumamente útil en Perl y realmente es una secuencia de operadores, su sintáxis es como sigue:

CONDICION ? PARTE-VERDADERA : PARTE-FALSA

Lo que te permite el operador es evaluar la CONDICION y dependiendo de si es verdadera o falsa se regresará la parte que corresponda. Esto se podrá comprender más con un ejemplo:

my $num = 10;
my $var1 = ($num > 5) ? Mayor : Menor;

Lo que estamos haciendo es realizando una asignación a la variable $var1 dependiendo de la condición. En este caso la condición es ($num > 5), si esto resulta verdadero, la palabra Mayor se asignará a la variable, de lo contrario será la palabra Menor. Este operador se podrá comprender más a fondo cuando veamos los enunciados de control en la siguiente sesión.


Operador de Rango (..)

El operador de rango nos resulta sumamente útil cuando queremos crear arrays con valores contiguos. Por ejemplo, dígamos que queremos crear un array con los números del 1 al 10, uno estaría tentado a hacerlo de la siguiente manera:

my @array = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

NOTA: Vemos como no usamos comillas para los valores en este caso debido a que los elementos son números NO cadenas de texto
Esto resulta sumamente impráctico, y más si queremos asignar mucho más números. Pero esto es posible comprimirlo usando el operador de rango:

my @array = (1..10);

Ahora tendremos nuestro array con la lista de números del 1 al 10 Pero aparte el operador es inteligente, entonces si hacemos algo así:

my @array = (01..10);

Nuestro array contendrá correctamente los valores 01,02,03,04,05,06,07,08,09,10. Ahora veamos que pasa si usamos letras:

my @array = ('a'..'e');

El resultado es justo como lo queremos a,b,c,d,e. Pongamos ahora en prueba a Perl, te puedes imaginar los valores que resultarían de lo siguiente:

my @array = ('aa'..'af');

Los valores serían aa,ab,ac,ad,ae,af.


Operador de Concatenación

Muchas veces no queremos sumar ni restar, o realizar ninguna operación entre dos operandos, sino que queremos ``pegarlos''. Para eso tenemos el operador de concatenación Este operador es un simple punto . y funciona de la siguiente manera:

1 my $saludo = "Hola me llamo ; 2 my $nombre = Uriel"; 3 4 my $frase = $saludo . $nombre;

Como resultado nuestra variable $frase tendrá el valor Hola me llamo Uriel. Pero, que pasa si combinamos números con cadenas:

my $edad = "Tengo  . 21 .  años".

Como resultado en la variable $edad tendremos el valor Tengo 21 años, pues Perl realiza la conversión del número 21 a una cadena detrás de las cortinas de manera automática.


Operador de Repetición

Este operador lo usamos para duplicar una cadena n número de veces. El operador se define con una x, por ejemplo:

my $var = "A" x 6;

Esto genera el valor AAAAAA.


Operadores de Asignación

A través de todo el tutorial hemos estado usando el operador de asignación básico =. Ahora veremos que hay más maneras de asignar un valor a una variable. Por ejemplo, dígamos que tenemos algo así:

1   my $var = 1;
2   my $num = 20;
3
4   $var = $var + $num;

Al final obtendremos el valor 21 en nuestra variable $var, pero esto se ve demasiado repetitivo y tedioso, y pues como siempre Perl tiene una manera más simple de realizar las cosas, pues esto lo podríamos lograr más sencillamente usando alguno de los operadores de asignación.

$var += $num;

Vemos como estamos usando un diferente operador de asignación +=. Este operador lo que hace es sumar el valor de la derecha a nuestra variable de la izquierda. Hechemos una vistazo a otro ejemplo para entender un poco más. Lo más seguro es que sepas el valor final de nuestra variable con solo verlo, pues Perl es muy intuitivo:

my $num = 5;
$num -= 4;

¿Puedes saber que valor tendrá $num?
Si dijiste 1 estás en lo correcto.
Muy sencillo, veamos uno más:

my $num = 3;
$num *= 3;

¿Cuál será el valor?
Si dijiste 9, estás en lo correcto
Aquí está la lista de todos los operadores de asignación disponibles:

1   var = op1;
2   var += op1;
3   var -= op1;
4   var *= op1;
5   var /= op1;
6   var %= op1;
7   var .= op1;
8   var **= op1;
9   var x= op1;
10  var <<= op1;
11  var >>= op1;
12  var &= op1;
13  var |= op1;
14  var ^= op1;

Orden de Precedencia

Muchas veces nos encontraremos usando varios operadores en una misma expresión.

my $var = 10 + 5 * 4 / 2;

Si esto sucede, ¿qué operadores se ejecutan primero? Para esto Perl tiene un orden de precedencia, es un orden establecido en donde podemos ver que operadores se ejecutan primero y cuales al final. Es sumamente importante que tengamos siempre presente esto o si no nos encontraremos con resultados innesperados. Aquí va una tabla con los operadores más usados ordenados por precedencia:

(), [], {}    LLamadas a funciones, paréntesis
++,--         Incremento y decremento
**            Exponenciación
*,/,%,x       Multiplicación,división,módulo,repetición
+,-,.         Suma, resta, concatenación de cadena
&&            AND lógico
||            OR lógico
..            Operador de rango
=             Operadores de asignación

Cabe destacar que la tabla para nada está completa, faltan muchos operadores, los cuales se podrán ver en la documentación de Perl. Simplemente se enlistaron los más comúnes
Viendo la tabla te podrías imagina el resultado de la siguiente operación:

my $num = 10 + 4 / 2;

(Música de concurso) Si dijiste que 7 estás incorrecto, el resultado será 12. La razón de esto es que si vemos la tabla de precedencia podremos ver que la división tiene más precedencia que la suma, por lo que la primera operación que se realiza es es 4/2, por lo que después se realiza 10+2. Pero ¿qué pasa si queremos que se ejecute la suma primero? Para eso nos sirven los paréntesis que tienen la mayor precedencia:

my $num = (10 + 4) / 2;

Ahora sí, como los paréntesis ocupan el primer lugar de precedencia lo primero que se ejecuta es 10+4 y después 14/7. Realmente es sencillo, solamente hay que recordar en todo momento los níveles de precedencia, y SIEMPRE haya alguna duda, usa los paréntesis. Así finalizamos con los operadores,
Podrán pensar que es demasiada información, pero como dije al principio, son bastante intuitivos, Se terminarán acostumbrando a ellos, pues junto con las variables, esto es lo más básico de Perl Muy bien, y así finaliza la exposición de la primera sesión de Perl Básico, Espero que ésta introducción les haya parecido buena, Ahora vamos a continuar con las preguntas y respuestas acerca del tema,

MUUUUCHOS APLAUSOS


PREGUNTAS Y RESPUESTAS

Q. Los hashes, que utilidad se le puede dar en un script o programa ???

Con los hashes se pueden hacer hermosas estructuras de datos :) Seguramente ya llegara el momento para adelantar algo sobre hash de hashes anonimos. Por ejemplo, uno de los principales usos que se les dá en los CGIs es cuano se reciben los campos de un formulario. Por lo menos, con un hash de hashes anonimos puedes representar la estructura de un grafo dirigido con pesos en sus arcos...

Q. me podrian dar algun ejemplo para poder analizarlo ?

my %Campos = (

'Nombre' => 'Uriel Lizama',
'Email' => 'uriel AT baboonsoftware PUNTO com', 'Edad' => 21
);

Los puedes usar para pasar un numero variable de parametros a una subrutina, tambien para guardar los valores de los atributos de un objeto

Q. la de $var = (condicion) ? verdadero : falso muchas veces necesité algo así y tuve que usar if else (cara de enojado)

ese operador terciario se hereda de lenguajes de programacion como C/C++ :)

Q. Hay un par de bugs.... bueno, he visto hasta 3... ¿como te los mando?

Enviar los errores que encuentren a uriel_AT_baboonsoftware_PUNTO_com

Q. Según leí en las entradas que mandaste al comienzo asignarias algunos ejercicios para practicar, cierto ?

Los ejercicios los pondré en el foro de Perl en Español ( http://perlenespanol.baboonsoftware.com/foro/ ), ahí mismo se podrá dar ayuda para resolverlos,

Valid XHTML 1.0 Transitional ˇCSS Válido! Built With WebMake