Hack.pm
  • Inicio
  • Recursos Perl
    • Tutoriales Perl
    • PerlDoc
    • Búsqueda en CPAN
    • meta CPAN
  • Perl para la Web
    • Catalyst Web Framework
    • Dancer MicroFramework
    • Mojolicious Web Framework
    • Template Toolkit
  • CV del autor

Author Archives: Juan Negretti

Cuidado con ese léxico, parte I

Posted on 07/04/2014 by Juan Negretti

Si bien este no es un blog para enseñar paso a paso como utilizar Perl, esta primera publicación cubre el proceso común de enseñanza como se cubre en el libro “Programming Perl”.

En la computación cuando se suele hablar de lenguajes de programación, sobre todo cuando tratamos con los lenguajes clásicos de alto nivel, siempre se trata de acercar el lenguaje de programación al lenguaje natural lo más posible. En distintos grados unos u otros lenguajes lo han logrado, otros, simplemente ni lo han intentado.

Perl (Quizás consecuencia de los estudios como lingüista de su creador, Larry Wall) ha recibido un considerable esfuerzo en impulsar tanto en su sintaxis como en su semántica una correcta distinción que permita reconocer fácilmente con qué figura linguística se encuentra tratando.

En Singular

Perl, formalmente hablando, hace uso de sigilos para distinguir variables de otros elementos sintácticos. Pero además de utilizar distinción a través de sigilos para separar las variables de las no-variables, existe distinción sintáctica entre los tipos de variables.

Desde que comenzamos a educarnos en esto del lenguaje (el de habla, no el de programación, porque allí la historia es otra y más triste) una de los primeros hechos que se nos hace evidente es el uno contra muchos (otra triste historia). Pero hablemos del uno primero, para hacerlo un poco más sencillo.

No creo que haga falta mucha presentación de los escalares: una manzana, una persona, el interpretador, la casa, el teléfono, mi publicación, tu lectura, nuestro correo, el entero, la cadena de caracteres, aquella colección (espera, esto no parece escalar, ya veremos).

say $manzana;
print $persona
my $publicacion = 116; #Algo posesivo
our $correo = "juan.negretti@ciens.ucv.ve"; #Un poco mas compartido

No creo que haga falta resaltar que el símbolo $ es el sigilo de escalar en Perl. Linguísticamente hablando es considerable mencionar que la figura de la variable es escalar, en el caso que estamos hablando, dado que perl contiene otras figuras linguísticas en las variables.

En Perl existe otra figura escalar importante, capaz de contener elementos en plural dentro de si inclusive. Los programadores de C/C++ se sentirán bastante cómodos (o quizás no, esto es un poco relativo a la experiencia) al ver que este viejo amigo vive en Perl.

Las referencias han sido un elemento vital dentro de los lenguajes de programación clásicos (y modernos, con menos presencia en los alternativos dado que su funcionamiento no lo requiere) en general como una forma de persistencia de las variables entre los ambientes.

En Perl el uso de las referencias tiene mayor relevancia, al punto de convertirse en un elemento sintáctica y semánticamente fundamental para el lenguaje. Como fue brevemente mencionado en la publicación anterior, el sistema de programación orientada a objetos de Perl gira alrededor de las referencias junto con otros elementos sintácticos, pero efectivamente, depende de las referencias.

Por supuesto, cualquier elemento escalar que hemos tratado puede ser referenciado

$correo_ref = \$correo

Igualmente Perl colabora con la distinción sintáctica de las referencias fuera del contexto de los sigilos de variables, sino en su declaración.

$publicaciones_ref = ["Bienvenida","Cuidado con ese léxico"]; #Referencia a un arreglo
$datos_publicacion_ref = {numero => 0, titulo => "Bienvenida"}; #Referencia a un hash
$publicacion_ref = Publicacion->crear #Referencia a un objeto publicacion

En Plural

Habiendo cubierto (parcialmente) los elementos escalares, demos un turno breve al plural, al hablar de muchos y no de uno. Perl utiliza tres estructuras para proveer estos medios. Es importante comprenderlas todas ellas dado que sus utilidades y usos son sumamente distintos y la eficiencia de ciertos códigos puede depender del correcto uso de cada uno.

El elemento básico para conformar colecciones de componentes en Perl es la lista. La lista no es más que un conjunto de elementos de cualquier tipo que se encuentran unidos sintácticamente de alguna forma. En si mismas representan el hablar en plurar en Perl, ellas generan un contexto, llamado por supuesto contexto de lista. Existen diversas formas de declarar una lista, no conversaremos en detalle de ellas. Algunos ejemplos de declaraciones de lista con Perl

("uno",2,["tres"]) #Las listas no deben ser homogeneas
qw/este operador es muy interesante para hacer listas de palabras que se separan por espacios/
foreach(1..9) { ... #Tenemos el operador de rango por ejemplo

Para que una lista mantenga su significado como tal es necesario que se opere en algún elemento sintáctico con contexto de lista. Por supuesto, esto es operar con la lista, pero quizás convenga almacenarla, conservarla.

La figura más común para tratar colecciones de elementos ha sido el arreglo, naturalmente como lenguaje Perl no es la excepción. Como todos los demás elementos conversados hasta el momento los arreglos tienen su propia figura sintáctica para identificarla, en este caso bajo la forma de sigilo.

@arreglo = ("uno",2,["tres"]);
@matriz = ([1,2],[3,4]); #Las matrices no son arreglos de arreglos, sino arreglos (o referencias de estos) de referencias a arreglos

Un arreglo siempre puede volver a su forma de lista cuando es operado en un elemento que maneje contexto de lista.

Naturalmente no sólo se quiere declarar un arreglo, es algo inútil (podemos discutir sobre esto, pero podría insultar a algunos seguidores de la realeza). Acceder a los elementos es igualmente importante. La forma de acceder a los elementos contenidos dentro de un arreglo puede ser algo confusa en principio, veamos

my @nuevos_elementos = ("foo","bar","baz"); #Un arreglo cliche para comenzar
print $nuevos_elementos[0]; #Output: foo
print $nuevos_elementos[-1] #Output: baz

En este punto el detallista dirá “Espera, ¿no estabamos hablando que los arreglos se distinguían por su sigilo @?”. En efecto, los arreglos se distinguen con su sigilo cuando se les trata como arreglos. Por el contrario, acceder a un elemento localizado de un arreglo es acceder a un elemento escalar, por lo cual el sigilo, será escalar. Por el contrario si se quiere acceder a una porción del arreglo, el sigilo cambiará nuevamente, despues de todo, estaremos accediendo a un arreglo nuevamente.

print @nuevos_elementos[1,2]; #Output: barbaz

Igualmente es de notar que Perl permite la navegación en arreglos en sentido inverso utilizando índices negativos. -1 es el índice representativo del último elemento del arreglo.

El sistema de sigilos de Perl, para programadores que tienen experiencia con lenguajes como Java, C/C++ puede resultar algo fuerte de confrontar en principio. Mi recomendación es comprenderlo desde la perspectiva del lenguaje natural, si hay más de un elemento, se usa el sigilo de arreglo, si es un elemento, se usa el sigilo de escalar. Plural y singular.

Por otra parte en Perl se maneja una segunda estructura de múltiples elementos (siendo esto bastante relativo) por defecto, el hash. El hash algunos programadores de otros lenguajes lo conocerán como arreglo asociativo (o diccionario), no obstante su implementación interna no tiene semejanza alguna con los arreglos. Los hash toman su nombre de la estructura con la cual se implementan internamente, las tablas hash. Son altamente recomendados cuando se quiere acceder a elementos individuales sin la necesidad de iterar sobre ellos, mejor conocido como accesos al azar.

La declaración de hash en Perl es muy similar al caso de los arreglos, con un par de diferencias. En primera, el sigilo de los hash es %. En segunda, en la lista que se utilice para alimentar la variable hash los elementos con índice par (contando desde cero naturalmente) son las llaves de acceso, mientras que los índices impares son los valores.

my %libro = ('isbn', '978-0-596-00492-7', 'titulo', 'Programming Perl', 'costo', 54.99);
my %libro =('isbn', '978-0-596-00492-7', 'titulo', 'Programming Perl', 'costo', 54.99, 'capitulos', ['An overview of perl', 'bits and pieces',]); #Se pueden hacer estructuras anidadas utilizando las referencias
my %hash_recurse = ('primero', {subprimero, 1, subsegundo, 2}, 'segundo',{subprimero, 1, subsegundo, 2}); #Hash de hash utilizando referencias

Lo primero que podrán notar es lo poco legible que resulta escribir un hash de esta manera. Afortunadamente los guru de Perl en su momento se adelantaron a esto, creando una forma distinta para la coma de forma que escribir un hash fuese un poco más legible.

my %libro = ('isbn'    => '978-0-596-00492-7',
             'titulo'  => 'Programming Perl',
             'costo'   =>  54.99,
);

El símbolo => no es más que una forma de azúcar sintáctica para la coma, para hacer fácil referencia en los hashes y en algunas otras funciones del lenguaje.

El acceso a los hash es igualmente similar al de los arreglos, sólo que en lugar de utilizar números exclusivamente hacemos uso de las llaves definidas para el hash, sin embargo hay que ser cuidadosos al tomar porciones de un hash.

print $libro{isbn}; #Output: 978-0-596-00492-7
print @libro{isbn,costo}; #Output: 978-0-596-00492-754.99

Observemos en primera que en lugar de usar corchetes para referir el arreglo, usamos llaves. Esto permite nuevamente establecer una separación sintáctica entre los arreglos y el hash. Es de notar también que al referir a la porción del hash no utilizamos % como se esperaría, al menos sin analizarlo un poco más. Al acceder a porciones del hash no nos interesan sus llaves, sino sus valores, y estos valores vienen bajo la forma de una lista ordenada, un arreglo. Es más razonable utilizar el sigilo de arreglo que el de hash.

De momento este es el final de la publicación. Aun hace falta continuar con elementos sintácticos y semánticos vitales en Perl.

Posted in Sintaxis | Leave a comment |
« Previous Page
Next Page »

Último

  • ¡Tan Im-pedante!
  • Cuidado con ese léxico: Parte II
  • Cuidado con ese léxico, parte I
  • Bienvenidos

Supuestamente Juan Negretti

Padre de una pequeña de tres años antes que nada. Perl Hacker en Construcción, programador PHP por necesidad. Adicto a Linux, Debian naturalmente. Desarrollador Web, Administrador de Servidores Linux. Estudiante de la Facultad de Ciencias UCV, Licenciatura en Computación, Último año. Instructor de Ensamblaje y Mantenimiento de Microcomputadores y de Administración de Linux. Consultor freelance de tecnologías web y soluciones basadas en Linux.

Categorías

  • Filosofía Hacker
  • Filosofía Perl
  • Frameworks
  • Ingeniería del Software
  • Sintaxis
  • Uncategorized
  • Utility

CyberChimps WordPress Themes

Contenidos protegidos bajo la Perl Artistic Licence