Perl Introduccion

download Perl Introduccion

of 37

Transcript of Perl Introduccion

  • 5/24/2018 Perl Introduccion

    1/37

  • 5/24/2018 Perl Introduccion

    2/37

    INTRODUCCIN AL LENGUAJE PERL

    ERL significa Practical Extraction and Report Language, algo as como lenguajeprctico de extraccin y de informes. Es un lenguaje creado por Larry Wall(quien, por cierto, es uno de los net-godsms conocidos en la actualidad) con el

    objetivo principal de simplificar las tareas de administracin de un sistema UNIX. Enrealidad hoy en da, en su ltima versin, se ha convertido en un lenguaje de propsitogeneral, y una de las principales herramientas de cualquiera que desee gestionar datosweb en internet.

    Es un lenguaje interpretado que tiene varias utilidades, pero est principalmenteorientado a la busqueda, extraccin y formateado de ficheros de tipo texto. Tambin esmuy usado para manejo y gestin de procesos ( estado de procesos , conteo yextraccin de parmetros caractersticos, etc...).

    Es una combinacin de las caractersticas de los lenguajes ms usados por losprogramadores de sistemas, como son los shell del sistema operativo UNIX, los utilidad( que incluye un lenguaje interpretado propio) awk para formateo y tratamiento de textoe incluso caracteristicas de Pascal, aunque su potencia se basa en la similitud con lasmejores caractersticas del lenguaje estructurado C. En general cualquier utilidad quese necesite realizar en sh, awk, o sed, se puede implementar de una manera maspotente y sencilla mediante el lenguaje PERL.

    Algunas de las ventajas del uso del lenguaje PERL son las siguientes: Construccin de pequeos programas que pueden ser usados como filtros para

    obtener informacin de ficheros, realizar busquedas, ...

    Se puede utilizar en varios entornos, como puede ser Windows 95, OS/2, ..., sinrealizar cambios de cdigo, siendo unicamente necesario la introduccin delintrprete PERL correspondiente a cada sistema operativo.

    Tambin es uno de los lenguajes mas utilizados en la programacin de CGIscripts, que son guiones o scripts que utilizan el interface CGI (CommonGateway Interface), para intercambio de informacin entre aplicaciones externasy servicios de informacin. Como ejemplo de ello tenemos los programas debsqueda usados por el browser Netscape.

    El mantenimiento y depuracin de un programa en PERL es mucho ms sencilloque la de cualquier programa en C.

    Es un lenguaje que hereda estructuras principalmente de los intrpretes decomandos de UNIX, especialmente el csh, y de otras utilidades estndar, como awk ysed. En realidad, puede hacer todo lo que hacen cualquiera de ellos y todos ellosjuntos, y la mayora de las veces de forma ms simple, comprensible y fcil de depurar.

    PERL es un lenguaje interpretado, aunque en realidad, el intrprete de PERL, comotodos los intrpretes modernos, compila los programas antes de ejecutarlos. Por eso se

    habla de scripts, y no de programas, concepto referido principalmente a programascompilados al lenguaje mquina nativo del ordenador y sistema operativo en el que seejecuta.

    P

  • 5/24/2018 Perl Introduccion

    3/37

    PERL es un lenguaje de programacin que busca antes que nada el facilitar laelaboracin de tareas comunes en sistemas tipo UNIX, donde tradicionalmente lastareas de administracin y proceso de datos se realiza con herramientas muy

    rudimentarias y por dems hostiles al usuario o administrador. Pero que se aplicansobre grandes cantidades de informacin (por lo regular texto) por lo que se requiereque sean de alto rendimiento.

    Aunque desarrollado originalmente en un entorno UNIX, actualmente hayversiones para casi todos los sistemas operativos: DOS (por ejemplo, la ltima versin,OpenDos) Windows NT, Amiga... Los scripts son compatibles entre las diversasplataformas, de forma que es un verdadero lenguaje multiplataforma. Muchosfabricantes lo incluyen en sus versiones de UNIX; tambin el Linux lo incluye.

    PERL surgi como una opcin para una gran cantidad de herramientas de UNIX

    en las cuales basa su propia sintxis, buscando el mnimo coste de su funcionalidadpor una mxima facilidad de programacin e integracin, siguiendo la filosofa demantener un ambiente que sea capaz de detectar y corregir pequeas omisiones delprogramador, y de proporcionarle una forma abreviada de realizar mltiples tareas. Enuna palabra, es una utilidad que pretende facilitar el proceso de grandes volmenes deinformacin sin perjudicar el rendimiento.

    Las plataformas donde PERL se ha desarrollado mas son los servidores UNIX,por sus necesidades de administracin y lo robusto de su manejo de memoria y deprocesos (requisitos de PERL hacia el sistema operativo) adems de la facilidad dePERL para realizar los as llamados CGIs, interfaces para comunicar recursos delservidor con un servicio de internet particular (como podra ser world wide webogopher), En otras plataformas, PC en particular, se han desarrollado versiones quemantienen un razonable grado de funcionalidad, pero en realidad, el sistema DOS notiene un manejo lo bastante bueno de los procesos o de la memoria para permitir aPERL dar un buen rendimiento, adems de que no es comn ver en PC necesidadesde administracin de la magnitud de un enorme servidor. Sin embargo, puedepracticarse la programacin en PERL de PC, o incluso elaborar programas en el , sinembargo, es algo que no se ha popularizado hasta hoy.

  • 5/24/2018 Perl Introduccion

    4/37

    ALGUNAS CONSIDERACIONES SOBRE PERL

    PERL no establece ninguna filosofa de programacin (de hecho, no se puede decirque sea orientado a objetos, modular o estructurado aun cuando soporta directamentetodos estos paradigmas de programacin), los objetivos que se tuvieron en cuenta aldisear la sintxis de PERL fueron la facilidad de aprendizaje y de uso y la claridad decdigo, las cuales, considero que son necesarias (aunque pueden escribirse programasen PERL complejos e inteligibles si as se desea).

    Por si fuese poco, PERL no es ni un compilador ni un intrprete, ya que est enun punto intermedio. Cuando mandamos a ejecutar un programa en PERL, se compilael cdigo fuente a un cdigo intermedio en memoria, se optimiza (como si fusemos aelaborar un programa ejecutable) pero es ejecutado por un motor, como si se tratasede un intrprete. El resultado final, es que utilizamos algo que se comporta como un

    intrprete pero que tiene un rendimiento comparativo al de programas compilados. Sinembargo, ya existen compiladores de PERL con la versin 5.

    En fin, PERL no nos obliga a nada, pero como es lgico hay ciertas reglas querecomiendo seguir para facilitar nuestro trabajo:

    Claridad

    En la mecnica de programacin actual, los programas deben de ser entendiblespor la persona que nos suceda en tareas de mantenimiento, de lo contrarioperjudicamos tanto a nuestros compaeros de trabajo como a nuestra propia libertad

    para progresar y mantenernos libres de preocupaciones.

    Indentacin

    Una costumbre ya clsica de la programacin, en lo personal, y a lo largo de losdistintos programas, es tabular el cdigo dos espacios hacia adelante al abrir cadabloque, y terminar la tabulacin al terminar el bloque, de modo que las llaves deapertura y cierre quedan a la vista y en la misma columna, solas en sus renglones (estoincrementa algo el numero de lneas, pero facilita sobremanera la bsqueda ycorreccin de los diversos bloques de control).

    Nombres de variables

    Es conveniente dar la mxima claridad a los nombres de las variables sinhacerlos demasiado grandes, el nombre de los contadores y variables que guardanvalores concernientes a un pequeo segmento de cdigo por lo regular son de un parde letras (c1, c2, ... cx para los contadores, s1, s2, etc para cadenas de entrada etc.)mientras que las variables que afectan a diversos segmentos (a modo de regla, quetienen su definicin en una pantalla distinta a donde se usan) tienen nombresexplicativos que conviene que no excedan los 12 caracteres. Adems, los nombres dearchivos se usan con maysculas (ARCHENT, ARCHSAL, etc) y las clases tienen su

    primera letra mayscula.

  • 5/24/2018 Perl Introduccion

    5/37

    Comentarios

    Para facilitar la comprensin de un programa no hay nada mejor que explicarlo, ylos comentarios son el medio ideal para hacerlo. Existen por lo menos tres comentariosque muchos consideran que siempre deben incluirse en un programa: qu hace el

    programa, quin lo escribi y cundo inicio y termin de escribirlo, sobre todo en elcontexto de una organizacin. Estos tres simples comentarios pueden hacer ladiferencia entre desestimar un programa como indescifrable o dedicarle algn tiempopara revisarlo. Adems, se considera prudente comentar dentro del cdigo la forma enque el programa deber ejecutarse, parmetros, y su sintxis, as como comentar lasestructuras de control como un modo de explicar la funcionalidad al detalle y resaltarcon comentarios las funciones que cumplen las variables.

    Sencillez

    Es cmodo en ocasiones el comprimir una serie de instrucciones en una sola

    lnea, queda al criterio decidir cuando se gana en claridad con un cdigo mas o menosextenso, pero no debe titubearse en comentar el cdigo que sea complejo.

    Bases de datos en PERL

    Lo ms fcil es usar el mdulo DBI (que, como todos los dems, est en elCPAN), con un driver especfico para el gestor de bases de datos, o si hay ningunoespecfico, y la base de datos est accesible usando ODBC, puede utilizarse conODBC. En Windows hay un mdulo alternativo, especfico para ODBC, denominadoWin32::ODBC. Con cualquiera de estos dos mdulos, se puede usar con cualquier

    sistema de gestin de bases de datos. En Linux y UNIX, se puede usar con MySQL oMiniSQL, o Postgres. Por ltimo, en Windows se puede usar tambin Microsoft SQLServer combinado con ODBC. Eso s, como es inherente a las conexiones ODBC, esuna forma menos gil de gestionar una base de datos.

  • 5/24/2018 Perl Introduccion

    6/37

    UN PRIMER PROGRAMA EN PERL

    Como se menciona en la introduccin, PERL no obliga a casi nada, as pues, lo que seplantea como estructura bsica es ms bien una convencin que un requisito dellenguaje, a diferencia de Pascal (por ejemplo) PERL no tiene una plantilla para susprogramas. Si se adoptan algunos protocolos es slo por comodidad.

    Los programas de PERL, por lo general, inician con la lnea:

    #!/usr/bin/perl

    Esta lnea, indica al sistema operativo que lo que sigue es un script de PERL, yque "PERL", el programa con el que debe ejecutarse, est en el directorio "/usr/bin"(lasecuencia "#!" es una secuencia que UNIX reconoce, no PERL).

    Un mtodo alterno, que funciona para otras plataformas, es: en lugar de colocaresa primera lnea ejecutamos:

    PERL nombre_del_script.plde modo que directamente se ejecuta el intrprete dePERL pasndole como primer parmetro el script a ejecutar (los dems parmetros setomaran como parmetros al programa). Si se requiere deber sustituirse "PERL" por laruta completa del programa y el nombre que el programa tenga.

    Para los ejemplos sucesivos, se asumir que se trabaja en un sistema UNIX conel intrprete de PERL en el directorio "/usr/bin".

    Resumiendo lo anteriormente expuesto, debe saberse que para ejecutar un programaen PERL podemos hacer dos cosas:

    Llamar desde la lnea de comandos al intrprete PERL, pasando comoparmetro el nombre del programa.sun630% perl primer.plLa extensin pl no es necesaria, pero se suele poner.

    Aadir en la primera lnea del programa lo siguiente : #! /usr/bin/perl

    Ademas debemos cambiar los permisos del fichero fuente, para poderloejecutar. Esto se realiza mediante la instruccin chmod: chmod u+x primer.plA continuacin de la primera linea escribiramos el guin del programa, y unavez hecho esto simplemente invocaramos el nombre del programa directamentedesde la lnea de comandos.sun630% primerl.pl

    Los caracteres #! sirven para denotar que lo que viene a continuacin hace referencia aun intrprete de comandos.

  • 5/24/2018 Perl Introduccion

    7/37

    Por ejemplo un perl script que mostrara por la pantalla el mensaje HOLAMUNDO se hara de la siguiente forma:

    #! /usr/bin/perlprint "HOLA MUNDO\n";

    Este sera uno de los programas ms bsicos en PERL, por no decir el que ms.

    Pero, funcionan exactamente igual los programas PERL en Windows y en UNIX?Engeneral, s. En particular, hay algunas cosas que no funcionan de la misma forma: porejemplo, la orden fork no funciona (salvo en la ltima versin), el acceso a base dedatos no se hace igual (se usa el mdulo DBD/DBI en Linux y en Windows,generalmente, el Win32::ODBC, aunque tambin se puede usar el mismo); paraejecutar un programa en PERL hay que definir una serie de parmetros. Pero engeneral, cualquier programa que no use ninguna caracterstica especfica de un

    sistema operativo funciona exactamente igual en los dos sistemas operativos. Y si hayalguna duda, se puede insertar cdigo particular detectando el valor de la variable$OSNAME, $^O o $Config{osname}.

  • 5/24/2018 Perl Introduccion

    8/37

    TIPOS DE DATOS EN PERL

    En el lenguaje PERL tiene tres tipos de datos:- Escalares- Vector de escalares- Vectores sociativos de escalares

    El tipo de dato escalar es denotado mediante un nombre de variable precedido delsmbolo $, y puede contener un nmero , una cadena de caracteres, y una cadena decaracteres en la que alguno de los caracteres puede ser un carcter especial.

    El escalar, es la clase de datos que engloba los tipos convencionales de datos, demodo que podemos decir:

    $v1="Pikachu";$v1=100;$v1=89.12;

    Sin que esto implique ningn cambio en la naturaleza de $v1, en todo momentoes un escalar.

    An cuando la compatibilidad de datos enteros y reales es fcil de imaginar, laconversin implcita en el caso de las cadenas no lo es, sin embargo la regla esbastante simple. Por ejemplo:

    $v1="123y321";

    Esto crea un escalar $v1, que contiene la cadena "123y312". Pero qu pasa sile deseamos sumar 4?. PERL, interpreta $v1 como entero (o punto flotante) para esto,toma todos los caracteres del inicio que forman un numero correcto y ese numero es elque interpreta; de modo que:

    print $v1+1;

    imprimir124, y del mismo modo, como ejemplo:

    $v2="123.123.123"+1

    da el valor 124.123 a la variable $v1 (punto flotante). Otro punto importante delas variables en general es que, aunque en ningn momento se declaran como de untipo o de otro, si se pueden "destruir", o revisar que hayan recibido algn valor en laejecucin del programa, esto se logra mediante las funciones defined() y undef():defined nos indica si la variable que le pasamos como argumento ha sido definida (esdecir, existe en el programa) o no. undef toma una variable y la "elimina" de modo queya no tiene valor y defined la reporta como no utilizada.

    Los valores lgicos de verdadero y falso se manejan de modo similar al de C, cualquiervalor escalar no nulo o cero se considera verdadero. Debe tenerse cuidado con lascadenas "0" pues si se evalan como nmero resultaran en falso aun cuando no soncadenas nulas.

  • 5/24/2018 Perl Introduccion

    9/37

    Los escalares son los constituyentes de las dems estructuras de datos, por lo que alexplicar los arreglos, hashes, referencias y archivos haremos muchas referencias aellos.

    Por ejemplo, si queremos definir una variable de tipo escalar llamada numero y quecontenga un el nmero 12 haramos:

    $numero = 12;

    Para almacenar una cadena de caracteres podemos hacer dos cosas:

    Definir el contenido entre comillas simples, no interpretandose ningn carcterespecial contenido entre ellas, un ejemplo podra ser :

    $palabra = 'pikachu';

    Definir el contenido entre comillas dobles , interpretandose cualquier caracterespecial contenido entre ellas a la hora de la impresin de la cadena, un ejemplopodra ser:

    $palabra = " pikachu \n";

    Por ltimo, podemos definir varias variables al mismo tiempo utilizando losparntesis por ejemplo:

    ($palabra1,$palabra2,$palabra3) = ("Pikachu","Espinete","Don Pimpn");

    El tipo de dato vector de escalares es denotado mediante un nombre de variableprecedido del simbolo @. Un ejemplo de inicializacin de una variable de este tipopodra ser:

    @frutas = ("manzana","pera","naranja","fresa");

    El nmero de elementos menos uno de un vector de escalares se puede obtenermediante el nombre de la variable precedido de los simbolos $#, por ejemplo si

    queremos obtener el nmero de elementos de @frutas haramos:

    $numero_de_elementos = $#frutas+1;

    Para ser ms exactos $# nos devuelve el ltimo indice del vector, as, si el valorpara el primer indice es 0 el nmero de elementos - 1 ser el ltimo valor permitidopara indexar el vector.

    El acceso a un elemento de un vector se hace mediante un ndice numrico dela forma $nom_variable [ indice ] ; asi, si quisieramos acceder al tercer elemento de@frutas haramos:

    $2_elemento = $frutas[2];

  • 5/24/2018 Perl Introduccion

    10/37

    Tambin podemos acceder a varios elementos de un vector de la formasiguiente:

    @nom_variable[indice1,...,indicen]

    Veamos ahora otra instruccin:

    print @frutas[1,2];

    Esto imprimira el elemento segundo y tercero del vector @frutas. Otra forma deindexar un vector es usando el operador rango .. , si quisieramos imprimir todos losvalores desde un indice i hasta un indice j deberamos utilizar el siguiente formato@nom_variable[i..j], por ejemplo:

    print @frutas[0..2];

    As se imprimiran todos los elementos del vector @frutas. Por ltimo tenemos

    tambin el tipo de dato vector asociativo de escalares, mediante este tipo de datospodemos acceder a un determinado elemento de un vector a travs de una claveanteriormente definida, para denotar este tipo de dato debemos preceder al nombre dela variable con el smbolo % . Un ejemplo de definicin de claves y valores de undeterminado vector asociativo podria ser:

    %precio = ( "manzana",100,"pera",20,"naranja",30,"fresa",200 );

    Si queremos acceder a un elemento de un vector asociativo, debemos seguir elsiguiente formato @nom_variable { clave }, un ejemplo podra ser:

    $numero_de_manzanas=10;$gasto = @precio {"manzana"} * $numero_de_manzanas;

    Ahora veremos una versin avanzada del HOLA MUNDO.En nuestro primerprograma no utilizamos ninguna variable, por lo que para explicar estos conceptosnecesitaremos un nuevo programa. Este es una versin personalizada del anteriorHOLA MUNDO.

    #!/usr/bin/perl#Programa Hola Mundo

    print "Hola cual es tu nombre?:";$nombre=;chop($nombre);print "$nombre!, bonito nombre, cuantos aos tienes?:";$edad=;print "sabias que te faltan ".(100-$edad)." para tener 100?\nAdios!\n";

    Su ejecucin genera resultados similares a los siguientes:

    Hola cual es tu nombre?: PikachuPikachu!, bonito nombre, cuantos aos tienes?: 6

    sabias que te faltan 94 para tener 100?Adis!

  • 5/24/2018 Perl Introduccion

    11/37

    En este programa, aparecen muchos elementos novedosos que iremosrevisando poco a poco a lo largo de este documento, por el momento, revisemos quehace lnea por lnea:

    #!/usr/bin/perl

    #Programa Hola Mundo Cabecera normal del programa, includo comentario indispensable.

    print "Hola cual es tu nombre?:";

    Esta lnea escribe "Hola cual es tu nombre?:" pero ntese que no escribe unavuelta de carro al final (omite el "\n").

    $nombre=;

    Aqu asignamos a $nombre un rengln escrito por la entrada estndar del

    programa(el teclado, por lo general).

    PERL define al "archivo" STDIN como su entrada estndar, y el operador que indica la lectura de una lnea de un archivo de texto, de modo que indicala lectura de un rengln de la entrada estndar (al menos para el ejemplo).

    Para fines prcticos, usaremos como la expresin que lee una lneade entrada del usuario desde teclado.

    chop($nombre);

    PERL, al leer la lnea escrita por el usuario, tambin toma el enter que elusuario da, de modo que en el ejemplo, la entrada que se da en vez de ser "Pikachu"se puede escribir como "Pikachul\n", (siendo "\n" el carcter de vuelta de carro), lafuncin "chop()" tiene la funcin de eliminar el ltimo carcter a nuestra cadena, demodo que despus de esta instruccin $nombre slo tiene "Pikachu". Por lascaractersticas de la lectura de renglones de archivos, chop() es un elemento casiconstante en programas de PERL.

    Si se comenta esta lnea, se comprobar que al imprimir el nombre imprimetambin el retorno de carro avanzando una lnea hacia abajo.

    print "$nombre!, bonito nombre, cuantos aos tienes?:";

    Esta lnea nos muestra como se imprime el contenido de nuestras variables deforma sencilla; notamos que en la cadena a imprimir se encuentra $nombre, elcompilador lo interpreta y reemplaza por su valor, (para imprimir "$" se pone "\$"), elresto de la cadena es completamente convencional.

    $edad=;

  • 5/24/2018 Perl Introduccion

    12/37

    Esta lnea, lee otra lnea de texto y la coloca en la variable $edad (con retornode carro includo).

    print "sabias que te faltan ".(100-$edad)." para tener 100?\nAdios!\n";

    Esta lnea imprime un mensaje que esta dividido en tres partes, la primera y laultima son cadenas convencionales, que estn concatenadas (operador .) con unaoperacin aritmtica. Hay que notar que edad era un rengln de la entrada estndar, yno un numero, sin embargo no hay conflicto de tipo al operarlo con un entero, porque?porque los dos, para PERL, son del mismo tipo, son escalares, como ya se hacomentado con anterioridad. Los escalares utilizan un mecanismo de conversin quese emplea para extraer el entero del texto contenido en $edad.

    Despus de un primer encuentro con las variables de PERL, el sentimiento

    mas probable es el de perplejidad, sobre todo para el programador habituado a trabajarcon lenguaje C, donde las restricciones de tipos estn bastante delimitadas y cualquierconversin requiere de una funcin especfica.

    En realidad, las variables de PERL pretenden simplificar el diseo delprograma, pero debiendo comprender cmo se pretende facilitar las cosas, para noterminar creando conflictos entre diferentes variables.

  • 5/24/2018 Perl Introduccion

    13/37

    ARREGLOS EN PERL

    Los arreglos en PERL son simplemente, arreglos dinmicos de escalares, es decir, sepueden usar cualesquiera elementos en el arreglo y PERL se encargar de hacer alarreglo de la dimensin adecuada.

    La definicin de un arreglo con valores constantes es:

    @a1=("hola",123,43.2,"adios");

    Esta definicin, crea el arreglo @a1 con cuatro elementos, dos cadenas, unentero y un real, en realidad, cuatro escalares, para hacer referencia a los elementos

    escalares de un arreglo se usan los corchetes [] indicando el ndice del elemento (decero al numero de elementos menos uno) de modo que:

    print "$a1[0]\n$a1[1]\n$a1[2]\n$a3[3]\n";

    resulta para el arreglo anterior:

    hola12343.2adis

    Ntese que el elemento de un arreglo ya no es un arreglo, sino un escalar, ydebe especificarse como tal, con $ en vez de @. No es lo mismo el escalar a1 que unelemento del arreglo a1. $a1 Es un elemento distinto que $a1[]

    Por claridad, es recomendable no duplicar nombres de arreglos (o cualquier otracosa) con escalares, aunque PERL da un manejo independiente a las diversasentidades, de modo que si se hace no habr quejas de parte de PERL.

    Es importante sealar que los arreglos y hashes no pueden ser elementos de un

    arreglo, si se intenta esto, los arreglos o hashes sern "acondicionados" a elementosque se agregan al arreglo. Por ejemplo:

    (a,b,(c,d),e)==(a,b,c,d,e)

    Es decir, el arreglo constante a,b, arregl con c,d , e es equivalente al arregloque contiene a,b,c,d,e. Pues al formar el primer arreglo, el sub-arreglo c,d es"aplanado" a elementos que se agregan al arreglo principal. Algo similar sucede a loshashes.

    Para hacer arreglos de arreglos o arreglos como elementos de hashes, seutilizan las referencias.

  • 5/24/2018 Perl Introduccion

    14/37

    HASH O ARREGLOS ASOCIATIVOS EN PERL

    El Hash, o arreglo asociativo es una ampliacin del arreglo, en la que en vez deubicar los elementos por posicin se les ubica por una "llave" es pues un arreglo deparejas ordenadas que se accesa por el primer elemento, el smbolo de los hashes es%, y la forma de declarar un hash con constantes es muy similar a la forma paradeclarar un arreglo:

    %h1=("ll1",1,"ll2",2,"ll3",3);

    Esta declaracin crea un hash con tres parejas ordenadas, las llaves son "ll1","ll2", "ll3", para usarlo se pueden usar expresiones del tipo:

    $ndx="ll3";print "$h1{ll1}\n$h1{"ll2"}\n$h1{$ndx}\n";

    resultando:123

    Al igual que en los arreglos, cada elemento de un hash es un escalar, de modoque debe anteponerse $ en vez de % (pues no estamos haciendo referencia a todo elhash, sino a un elemento escalar del hash), pero a diferencia del los arreglos, en vezde usar [] para indicar el ndice se usan las llaves {}.

    Dentro de las llaves, en el ejemplo, usamos las tres formas principales de dar elndice: ll1 - En esta forma PERL adivina correctamente que ll1 es una cadena y queesta es la llave.

    "ll2" - En esta forma decimos explcitamente el valor de la llave deseada.

    $ndx- como $ndx="ll3" PERL puede determinar el valor de la llave correcta.

    Para ndices, al igual que para hashes, tambin puede usarse el valor devariables o de expresiones para especificar el ndice.

  • 5/24/2018 Perl Introduccion

    15/37

    EQUIVALENCIAS DE CLASES

    Como ya revisamos, al hacer referencia a un elemento particular de un arreglo o hashobtenemos un escalar (en ves de todo el arreglo o hash). Este tipo de "cambios" declase son el propsito de esta seccin, pues pueden resultar algo confusos aunque,una vez comprendidos, dan una buena parte de las caractersticas peculiares de PERL.

    Bsicamente, PERL distingue dos tipos de contextos para evaluar unaexpresin: como escalar y como arreglo.

    El primero se refiere a las expresiones que han de regresar un escalar (del tipoque sea) como resultado, y el segundo a aquellas expresiones que han de regresar unarreglo o conjunto de escalares como resultado. Muchas expresiones pueden ser

    evaluadas en ambos contextos y obtener, segn el contexto, un resultado distinto, estolo revisaremos con cuidado conforme vayamos revisando estas expresiones.Revisemos los cambios que ocurren a los datos de una cierta clase cuando losevaluamos en otro contexto:

    Las transiciones mas utilizadas son las de arreglo a escalar, las de arreglo a hash y dehash a arreglo, la primera porque permite conocer el tamao de los arreglos y lassegundas porque proveen los mecanismos para inicializar los hashes con arreglosconstantes y para "acondicionarlos" con fines de almacenamiento e impresin.A menudo, se representa un arreglo con una sola cadena que contiene separadorespara los diversos elementos, PERL implementa la funcin "split" que divide estascadenas en arreglos, su sintxis bsica es:

    split($delim,$cadena)

    Donde $delim es la expresin que representa los delimitadores de elementosy $cadena es la cadena a dividir.

    Como ya se mencion, generar un arreglo de cadenas donde los elementosson las subcadenas de $cadena que estn separadas por cadenas $delim.

    Por ejemplo, una cadena como:$registro="[email protected]";@reg=split(":",$registro);print "Nombre:$reg[0]\nEdad:$reg[1]\nEmail:$reg[2]\n";

    Genera un resultado similar a:

    Nombre:PikachuEdad:6Email:[email protected]

  • 5/24/2018 Perl Introduccion

    16/37

    No todas las funciones de PERL convierten de igual forma los arreglos enescalares, por lo que debe provarse o investigar primero que efectivamente en elcontexto en que hagamos la conversin el resultado sea el deseado.

    Ejemplos:

    @arreglo=(1,2,"hola",3,"adios");

    Esto inicializa el arreglo @arreglo con los elementos 1,2,"hola",3,"adios",(todos escalares). la notacin de los elementos entre parntesis define un arregloconstante, el equivalente a un numero o cadena constante cuyo valor asignramos auna variable pero en el contexto de los arreglos.

    Ahora un ejemplo de hash constante:

    %hash=("llave1","dato1","llave2","dato2);

    Arreglo constante a hash Inicializa el %hash con las llaves "llave1" y "llave2"ponindole como contenidos "dato1" y "dato2" respectivamente. De hecho, noespecificamos un "hash constante" como en el caso del arreglo, sino queespecificamos un arreglo constante el cual pasa por una transformacin de clase paraasignarse a un hash, de modo que la expresin es equivalente a:

    @arreglo=("llave1","dato1","llave2","dato2);%hash=@arreglo; #arreglo a hash

    Ahora otro ejemplo de cardinalidad de un arreglo:

    @arreglo=(1,2,3,4);$elementos=@arreglo;

    En este caso $elemento recibe el valor 4, pues son 4 los elementos delarreglo, ntese que el ndice mximo en el arreglo es de solo tres, pues el primerelemento es el elemento 0 y PERL 4 regresa, con esta misma expresin el ndicemximo en lugar del nmero de elementos como PERL 5.

    Ejemplo de asignacin a arreglo constante:

    ($a,$b,$c)=(1,2,3);

    Esta expresin es equivalente a:

    $a=1;$b=2;$c=3;

  • 5/24/2018 Perl Introduccion

    17/37

    Pero debe examinarse cuidadosamente, el siguiente cdigo:

    ($a,$b,$c)=(1,2,3);@a=($a,$b,$c);$a=7;

    $b=8;$c=9;

    Da al arreglo @a el valor del arreglo constante (1,2,3), y no, como podrapensarse. (7,8,9). Cuando se genera un arreglo constante se evalan los elementosque lo forman como constantes escalares y se le asigna despus, para obtenerresultados diferentes se deber usar un arreglo de referencias.

    Veamos ahora un ejemplo de arreglos con arreglos:

    @a=(1,2,3);

    @b=(5,6,7);@c=(@a,4,@b,8);

    Estas expresiones generan tres arreglos, (1,2,3), (5,6,7) y (1,2,3,4,5,6,7,8), yno, como podra pensarse un arreglo de arreglos, cuando incluimos un arreglo dentrode otro, PERL "acondiciona" el arreglo insertado como si insertara uno a uno todos suselementos en la posicin indicada del arreglo que ha de contenerlos, para hacerarreglos de arreglos deberemos usar referencias a stos.

  • 5/24/2018 Perl Introduccion

    18/37

    OTRAS CONSIDERACIONES SOBRE LOS DATOS

    En PERL existen formas de hacer determinadas cosas imposibles con otros tipos.Adems,

    Referencias

    Este tipo de datos es exclusivo de PERL 5, ya que PERL 4 usaba los type globs pararealizar algunas de estas funciones, pero el proceso es mucho mas complicado yobscuro.

    Las referencias son el equivalente lgico de los punteros, son un tipo de datoque no contiene informacin en s misma, sino que permite manejar indirectamente losdatos contenidos en otra entidad.

    Las referencias, sin embargo, no forman una clase nueva de datos, sino que sontratados como un tipo ms de escalar.

    La definicin de referencias se realiza por el operador referencia "\" (backslash) ,funciona de modo similar a "&" en C, y aunque a diferencia de C no hay un operador dede referencia, la sintxis para acceder al dato original es muy sencilla.

    A diferencia de C, los objetos que creemos mediante referencias no quedancomo cadveres en memoria, PERL lleva un registro de las diversas referencias a cadaelemento en memoria y automticamente lo destruye cuando descubre que nadie haceya referencia a l, de modo que pueden usarse las referencias sin miedo, aunque conla precaucin necesaria para no perder los datos que se almacenan en ellas.

    Creacin

    Podemos crear referencias de varias formas, siendo las ms sencillas y tiles las quese citan a continuacin.

    Usando el operador de referenciacin en una variable, o valor, en el caso de unavariable, es crear un medio alterno de acceder al valor de la variable.

    $rescalar=\$escalar;$rarreglo=\@arreglo;$rhash=\%hash;$rrutina=\&subrutina;

    Creando objetos "annimos" que solo pueden ser utilizados por medio de la referencia.

    Escalares

    $rescalar=\"hola"; #referencia a la cadena annima "hola"Arreglos:

  • 5/24/2018 Perl Introduccion

    19/37

    $rarreglo=[1,2,3]; # referencia al arreglo annimo (1,2,3)Hashes

    $rhash={"llave1"=> "dato1","llave2"=> "dato2"};

    Ntese que en esta representacin usamos adems el operador "=>" que indica unapareja de llave y dato, las que se separan por comas; esta notacin tambin es validapara hashes convencionales, pero la claridad que agrega es mejor utilizada al declararhashes annimos.

    Como elementos de arreglos y/o hashes para formar estructuras de datos complejas, alser escalares, son elementos del arreglo sin mas complicacin,de modo que losarreglos a los que hacen referencia se mantienen intctos.

    Por ejemplo, para formar un hash que contenga arreglos de nombres de letras:

    %rhletras={"latinas"=> ["a","b","c"],"gregas"=> ["alfa","beta","gamma"]};Esta sentencia forma un hash donde las llaves son cadenas y los datos son referenciaa arreglos.

    Pueden convinarse las referencias a arreglos y a hashes annimos a voluntad paraformar una estructura de datos tan compleja como se desee.

    Usos

    De nada sirven las referencias si no podemos extraer y modificar los datos contenidosen los elementos sealados por la referencia, en PERL la forma para obtener el valor ypara modificarlo es casi la misma, solo las abreviaturas de las referencias para obtenerel valor funcionaran de modo distinto cuando tratemos de asignarles valor.

    An cuando PERL tiene varias formas de "referenciar" la informacin, slo sediscutirn dos por considerarlas las ms sencillas.

    Veamos el uso "simblico" de las referencias. Por regla general, podemos usarlas referencias como si se sustituyeran antes de ejecutar el cdigo (aunque en realidad,

    no sea as), de modo que el cdigo:

    $nombre="entero";$entero=5;$rentero=\$entero;$$nombre=6;$$rentero=7;

    Efectivamente cambia el valor de $entero de 5 a 6 y despues de 6 a 7, delmismo modo podemos usar las referencias refirindonos a cualquier otro tipo.

  • 5/24/2018 Perl Introduccion

    20/37

    Por ejemplo, para arreglos:

    $rarreglo=[1,2,3,4];$$rarreglo[2]="tres";

    @$rarreglo=();

    Como una forma de abreviar el proceso para referencias a arreglos y hashes, seaadi el operador -> que indica que el escalar es una referencia a hash o arreglo yespera el ndice despus. Por ejemplo:

    $rarreglo->[5]="algo";

    Esto coloca "algo" como el 6o elemento del arreglo al que hace referencia a

    $rarreglo.$rhash->{"alfa"}="uno";

    Coloca la pareja ("alfa"=> "uno") en el hash al que hace referencia $rhash.

    Se pueden obtener referencias a referencias, y se pueden hacer arreglos dereferencias, de modo que los arreglos multidimencionales se pueden elaborar con lamisma mecnica que en C.

    $ra3d->[0]->[0]->[0]=1; Ntese que al crear perl los arreglos de las dimensiones adecuadasautomticamente no hay problemas de invasin de memoria no reservada (aunque unuso descuidado puede ocupar cantidades demasiado grandes de memoria). Y estaaplicacin se considero lo bastante frecuente para implementar una abreviatura, demodo que la expresin anterior es equivalente a:

    $ra3d[0][0][0]=1;

    Lo cul le da ms claridad de lectura al cdigo (pero debe tenerse cuidado de noconfundirlo con un elemento de un arreglo, $ra3d es una referencia a un arreglo dereferencias y no un arreglo normal. Por claridad se puede usar:

    $ra3d->[0][0][0]=1;

  • 5/24/2018 Perl Introduccion

    21/37

    CONVENCIONES GENERALES DE SINTXIS EN PERL

    Como ya hemos podido observar, todas las intrucciones de PERL deben deben acabar

    en ;(al igual que en C y C++) . Por ejemplo:

    $numero = 2;print$numero;

    Adems, las nicas cosas que deben de ser declaradas en PERL son losformatos de salida o reports y las subrrutinas . Todas las variables creadas y noinicializadas tienen como valor por defecto nulo o cero. Los comentarios deben irprecedidos del smbolo #. Ahora veremos de forma prctica el uso de las sentencias decontrol condicionales e iterativas que suministra el lenguaje PERL para alterar el flujode un programa.

    En primer lugar entenderemos como bloque a todo conjunto de sentencias quese encuentren entre dos llaves, por ejemplo lo siguiente sera un bloque:

    { $numero=2;print$numero;}

    Los bloques, adems, pueden ser etiquetados anteponiendo a la llave deapertura el nombre de la etiqueta mas dos puntos.

    En segundo lugar entenderemos como expresin a toda expresin cuyaevaluacin resulte ser un valor booleano, es decir, verdadero o falso. Hay que tener encuenta que en PERL se considera como verdadero todo valor no nulo,luego se puedenpresentar como expresiones el resultado de una asignacin,de una bsqueda etc...

    Una vez hechas estas consideraciones pasamos a ver la sintxis de los distintosesquemas de control, que como ya hemos dicho antes pueden ser:

    Esquemas condicionales. Esquemas iterativos.

    Dentro de los primeros tenemos los siguientes formatos:

    if (EXPRESION) BLOQUE

    Un ejemplo de uso podra ser:

    print " Pensando un nmero....\n"; $numero = rand(100);print> " Introduce un numero del 1 al 100:";$entrada = ;if($entrada == $numero) {print "Has acertado el numero\n";}if($entrada > $numero) {print "El numero introducido es mayor que el pensado.\n";}

  • 5/24/2018 Perl Introduccion

    22/37

    if($entrada < $numero) {print "El numero introducido es menor que el pensado.\n";}print" El nmero pensado era:",$numero;

    if (EXPRESION) BLOQUE else BLOQUE.

    Un ejemplo podria ser el siguiente:

    print" Pensando un nmero...\n"; $numero = rand(100); print" Introduce un numero del 1 al 100:"; $entrada = ;if($entrada == $numero) { print"Has acertado el numero\n"; }else {

    if($entrada > $numero) { print"El numero introducido es mayor que el pensado.\n"; } else { print "El numero introducido es menor que el pensado.\n"; } }

    if (EXPRESION) BLOQUE elsif (EXPRESION) BLOQUE .... else BLOQUE.

    Un ejemplo podria ser el mostrado a continuacin:

    print" ensando un nmero...\n";$numero = print(100); print" Introduce un numero del 1 al 100:";$entrada = ;if($entrada == $numero) { print"Has acertado el numero\n"; }

    elsif($entrada > $numero) { print"El numero introducido es mayor que el pensado.\n"; } else { print "El numero introducido es menor que el pensado.\n"; }

    En lugar de if podemos usar unless que tiene el significado contrario. Dentro de losesquemas iterativos tenemos:

  • 5/24/2018 Perl Introduccion

    23/37

    while (EXPRESION) BLOQUE

    Mientras se cumpla la condicin EXP se ejecutar todo lo que haya dentro delbloque. Un ejemplo podra ser:

    print" Pensando un nmero ....\n";$numero = rand(100);$entrada = $numero+1; while ($entrada > $numero) { print" Introduce un numero del 1 al 100, menor que el pensado:"; $entrada = ; if($entrada > $numero) { print "El numero introducido es mayor que el pensado.\n"; }

    }print " EL NUMERO PENSADO ERA:",$numero;print "\n";

    En lugar de while podemos usar until, que tiene el efecto contrario a ste. Siadems queremos hacer la primera comparacin despus de la primera iteracin,podemos usar un esquema iterativo do BLOQUE until o do BLOQUE while.

    for (EXPRESION;EXPRESION;EXPRESION)

    Su uso es exactamente igual que en C; un ejemplo de uso sera:

    print "IMPRIMIENDO DEL 1 al 100:\n";getc;for($i=1;$i

  • 5/24/2018 Perl Introduccion

    24/37

    sub HOLA { print "HOLA\n"; }

    La llamada a la subrutina la haramos usando do nombre_de_la_subrutina(); o&nombre_de_la_subrutina; Las dos formas producen el mismo resultado con laexcepcin de que en el caso de do hay siempre que poner los parntesis, si queremospasar argumentos debemos pasar los argumentos entre estos parntesis, y estos sernalmacenados en el vector de escalares @_, es decir para saber el numero y el valor delos argumentos pasados a una subrutina hay que leer de este vector predefinido. Unejemplo podra ser el siguiente:

    sub imprime { local($cadena)=@_;

    print $cadena; } &imprime ("HOLA\n");

    En el ejemplo anterior se usa la funcin local(), que sirve para declarar variableslocales a la subrutina, por supuesto podramos haber hecho referencia directamente ael vector @_. El valor devielto por la subrutina es el de la ltima expresin evaluada, ypuede ser tanto un vector como un escalar. Tambin podemos devolver explicitamenteun valor usando return, como en C.

    Tambin resulta interesante la declaracin y uso de formatos o reports. Con ladefinicin de un report, estamos alterando el formato de salida de los registros cuandoutilizamos la funcin write. La sintxis para la definicin de un formato es:

    format NOMBRE = FORMLIST .

    Si NOMBRE se omite, entonces STDOUT es tomado como el dispositivo desalida. FORMLIST contiene el formato de la salida de la forma:

    TABULACIN_CAMPO1,TABULACIN_CAMPO2,...,TABULACIN_CAMPON

    variable1, variable2,.........,variablen

    El tipo de tabulacin se consigue usando los smbolos: < : tabulacin a la izquierda. > : tabulacin a la derecha. | : texto centrado.

    Pondremos tantos smbolos como la longitud mxima requerida para representar elvalor de la variable asignada a ese campo, adems al principio de la definicin de loscampos de tabulacin debe estar el smbolo @.

  • 5/24/2018 Perl Introduccion

    25/37

    OPERADORES EN PERL

    PERL soporta una gran cantidad de operadores, la mayoria de ellos heredados dellenguaje C. En PERL los operadores conservan el mismo uso que en el resto de

    lenguajes, y se utilizan para realizar operaciones aritmeticas, operaciones logicas ...,entre las variables del programa. Los operadores pueden clasificarse en los siguientestipos:

    Operadores de comparacin: mediante estos operadores podemos enfrentardos expresiones, de manera, que dependiendo de su valor se generar unresultado que puede ser lgico o numrico. PERL tiene los siguientesoperadores de comparacin:

    == . Este operador sirve para comparar dos valores iguales, de maneraque cuando las expresiones a su izquierda y su derecha son iguales,devuelve un valor lgico verdadero y cuando no lo son devuelve falso: Error!Referencia de hipervnculo no vlida.($var == 3) { ...}

    en el caso de que el contenido de la variable sea tres se realizan lasoperaciones entre parentesis.

    eq . Es empleado para comparar expresiones no numricas, esto es, seutiliza de igual manera que == pero para cadenas.

    != . Con este operador se comparan cantidades numricas diferentes. Error!Referencia de hipervnculo no vlida.($var != 3) { ...}

    si los valores son diferentes se ejecutan la instrucciones entre llaves. ne . Se utiliza para comparar cantidades no numericas diferentes. Su

    funcionamiento es similar que el de !=. < . Verifica el valor de una cantidad numrica con repecto del valor de la

    expresin de la derecha, de modo que si el valor de esta expresin esmayor que el de la cantidad numrica se devuelve cierto, en casocontrario se devuelve falso: Error!Referencia de hipervnculo no vlida.($var < 3) { ...}

    ejecuta las instrucciones entre parentesis si el valor de var es menor quetres.

    "> . Verifica el valor de una cantidad numrica con repecto del valor de laexpresin de la derecha, de modo que si el valor de esta expresin es

    menor que el de la cantidad numrica se devuelve cierto, en casocontrario se devuelve falso: Error!Referencia de hipervnculo no vlida.($var > 3) { ...}

    ejecuta las instrucciones entre parentesis si el valor de var es mayor quetres. Los operadores para los terminos menor o igual y mayor o igual son= respectivamente, y en ambos casos adems de el significado decada trmino explicado anteriormente, se devuelve cierto si lasexpresiones son iguales.Como en el caso de las operaciones anteriores, existen equivalentes quese utilizan con las cadenas no nmericas para los terminos < yError!Referencia de hipervnculo no vlida.. Estos operadores son: ltque devuelve cierto si el orden de la cadena de la izquierda es menor que

  • 5/24/2018 Perl Introduccion

    26/37

    el de la cadena de la derecha, y gt que devuelve cierto si la cadena de laizquierda es mayor que el orden de la cadena de la derecha.

    cmp . Este termino es utilizado para comparar caracteres, de maneraque, retorna 0 si los caracteres comparados son iguales, 1 si la cadena dela derecha se encuentra al comienzo de la de la izquierda, y -1 en el caso

    contrario:

    'one' cmp 'one'DEVUELVE 0 'one dog ' cmp 'one'DEVUELVE 1 'dog one' cmp 'one'DEVUELVE -1 'es diferente' cmp 'one'DEVUELVE -1

    " . Este termino se utiliza para comparar valores numericos,retornando 0 cuando son iguales, 1 cuando el termino de la derecha esmenor que el de la izquierda y -1 en el caso contrario.

    =~ . Este termino es usado en las expresiones regulares para indicar lapresencia de un patrn de compracin dentro de una variable quecontiene una cadena de caracteres: Error!Referencia de hipervnculo no vlida.($var =~/pepe/) { ...}

    verifica si la cadena 'pepe' se encuentra dentro de var y si es as, ejecutael cdigo entre llaves.

    !~ . Meditante este operador se verifica la no existencia del patrn debusqueda en una cadena: Error!Referencia de hipervnculo no vlida.($var !~/pepe/) { ...}

    si la cadena 'pepe' no esta en var se ejecuta el codigo entre llaves. Operadores de asignacin: los terminos de asignacin se utilizan en PERL

    para dar valores a cualquiera de las variables validas en PERL. Existen en Perllos siguientes operadores de asignacin:

    = . Con este termino se asigna a la variable que se encuentra a laizquierda del operador el valor de la expresin de la derecha. Asimediante este valor se pueden dar valores iniciales a cualquier variable:

    $var = 'Buenos dias';

    asigna la cadena 'Buenos dias' a la variable var. =~ . A parte de la funcin de verificacin de existencia de un patrn dentro

    de una cadena que anteriormente se explic, este operador dentro de unaexpresin regular de sustitucin se utiliza para sustituir un patrn decomparacin por otra cadena: $var =~ s/one/uno/;

    se reemplaza la ocurrencia de la cadena 'one' por la cadena 'uno'. Operadores aritmticos: Mediante estos terminos se realizan las operaciones

    aritmticas necerias para el manejo de las expresiones. A parte de losoperadores aritmticos comunes; +(suma), -(resta), *(multiplicacin) y /(divisin),PERL tambien incluye los siguientes operadores:

  • 5/24/2018 Perl Introduccion

    27/37

    ** Este trmino se emplea para obtener la potencia de un valor numrico,ejemplo :$var = 6;$var**2;el valor almacenado en var es 36.

    . Este trmino se emplea para concatenar dos cadenas de caracteres,ejemplo: $var = 'Fulanito '; $var . 'De tal';

    var contendr la cadena Fulanito De tal. x Este trmino multiplica n veces la cadena de caracteres especificada,

    ejemplo : 'd' x 20;

    expresa una cadena de 20 caracteres d. % Permite obtener el mdulo de la divisin entre dos nmeros, ejemplo :

    $var = 5 % 2;el valor que se asigna a var es 1.

    | Este trmino cuando se emplea entre 2 valores numricos, permiterealizar una operacin binaria 'o' entre ellos, ejemplo $var = 3 | 2;el valor que se asigna a la variable es 3.

    & Este trmino cuando se emplea entre 2 valores numricos, permiterealizar una operacin binaria 'y' entre ellos, ejemplo : $var = 3 & 2;

    el valor asignado es 2.El operador de asignacin Error!Referencia de hipervnculo no vlida.estmuy relacionado con los operadores aritmticos de modo que PERL permite quese combinen ambos siguiendo este formato general: $variable (operador aritmetico)= expresin;En general lo que se consigue con este formato es realizar la operacinaritmetica, y posteriormente asignar el valor a la variable. As aqu vemosalgunos ejemplos de esta combinacin: $var = 5; $var += 6;despus de esta asignacin el valor de var sera 11 (ha sumado 6 al valor

    anterior de la variable y posteriormente ha asignado el resultado). $var = 5; $var %= 2;el valor actual de la variable sera 1.

    Operadores lgicos o relacionales: permiten relacionar dos o ms expresionescondicionales para determinar si el resultado lgico es falso o cierto. Estos son losdiferentes operadores lgicos que emplea PERL:

    | . Este operador se utiliza en las Error!Referencia de hipervnculo novlida.como operador lgico 'o', de modo que retorna cierto siempre quecualquiera de los patrnes de busqueda que componen la expresin sea cierto yfalso cuando los dos son falsos. Por ejemplo Error!Referencia de hipervnculo no vlida.($var !~/pepe | juan/) { ...}

  • 5/24/2018 Perl Introduccion

    28/37

    el cdigo entre llaves se ejecuta si en la cadena que se encuentra dentro de lavarible existe una ocurrencia igual a 'pepe' o igual a 'juan'.Adems de utilizarse dentro de las expresiones regulares, tambin se utilizapara unir mediante la operacin 'o' dos expresiones condicionales. As porejemplo:

    Error!Referencia de hipervnculo no vlida.($var == 6 | $var < 3) { ...}

    ejecuta el cdigo entre llaves si la variable es igual a 6 o menor que 3. || . Tambin representa la operacin lgica 'o' pero en este caso se utiliza sobre

    instrucciones no sobre expresiones. & . Este operador trabaja como un operador lgico 'y' en expresiones regulares,

    permite confrontar 2 patrones, de modo que para que se produzca un valorcierto se tiene que cumplir la existencia de ambos en la cadena donde se realizala comparacin, en el caso contrario el valor devuelto es falso, ejemplo:if($var =~ /coche & moto/) { ...}el cdigo entre parentesis se ejecuta si dentro de la variable existe unaocurrencia de la cadena 'coche' y otra de la cadena 'moto'. Como en el caso deloperador | tambin se utiliza para relaccionar expresiones condicionales.

    && . Al igual que el operador anterior trabaja como un operador lgico 'y', perocon la diferencia de que este operador se emplea sobre instrucciones y no sobreexpresiones regulares.

    ! . Con este operador realizamos una evaluacin negativa de la expresin,ejemplo:if(!$var) { ...}el cdigo entre llaves se ejecuta si la variable var es nulo o 0.

    Operadores de Archivo: estos operadores se emplean para verificar en el sistemaoperativo los permisos de un archivo, o su naturaleza de ejecucin, etc. A continuacinse muestra los diferentes operadores:

    -r : indica si el archivo tiene permiso de lectura. -W : indica si el archivo tiene permiso de escritura. -T : indica si el archivo es de tipo texto. -e : indica si el archivo existe. -z : indica si el archivo tiene tamao 0. -s : indica si el archivo es mayor que 0. -f : indica si el archivo es plano. -d : indica si se trata de un directorio. -M : indica el nmero dias despues de la ltima modificacin -B : indica si el archivo es binario. -t : indica si el archivo esta abierto en un terminal.

  • 5/24/2018 Perl Introduccion

    29/37

    VARIABLES PREDEFINIDAS EN PERL

    Los siguientes nombres tienen un significado especial en PERL. Solamente se inluirnlos ms comunes:

    $_contiene el contenido del ltimo registro leido de un fichero. $.contiene el nmero de la ltima lnea leida de un fichero. $/separador de campo para la entrada. $,separador de campo para la salida, aplicable a print. $\separador de registro para la salida, aplicable a print. $~contiene el nombre del formato o report definido para la salida actual. $^contiene el nombre de la cabecera de formato o report definido para la salida

    actual. $$nmero de proceso perl scripts que se esta ejecutando actualmente. $&representa el valor de la ltimo cadena de caracteres comparada

    exitosamente. $` y $'estos dos terminos se utilizan conjuntamente para separar cadenas de

    caracteres comparadas exitosamente. $!contiene el valor actual de ERRNO, es decir, el ltimo error acontecido. $0contiene el nombre del fichero que hemos dado a nuestro perl script. $[contiene el valor del primer indice de una array de escalares, por defecto es 0. $< uid real del proceso actual. $> uid efectivo del proceso actual. $( gid real del proceso actual.

    $) gid efectivo del proceso actual. @ARGV contiene los parmetros pasados a nuestro perl script. %ENV array asociativo que contiene las variables de entorno bajo el que se

    ejecuta nuestro perl script.

  • 5/24/2018 Perl Introduccion

    30/37

    EXPRESIONES REGULARES EN PERL

    Las expresiones regulares en PERL nos permiten evaluar o comparar la existencia deun patrn de bsqueda en una cadena o un valor determinado; as por ejemplo, si se

    tiene un archivo de muchas lneas y se quiere imprimir las lneas que tengan en suinicio un determinado carcter, o se desea reemplazar todas las ocurrencias de unadeterminada palabra dentro del fichero , se deben emplear las expresiones regulares.Se pueden dividir las expresiones regulares en los siguientes tipos:

    Expresiones regulares de comparacin : Nos permiten evaluar si un patrn debsqueda se encuentra en una cadena de caracteres, de modo que medianteeste tipo de expresiones regulares obtendremos un valor lgico verdadero ofalso segn se encuentre el patrn deseado. La sintaxis de este tipo deexpresiones regulares es la siguiente:

    valor a comparar =/patrn de bsqueda/;

    El principal uso de las expresiones regulares de comparacin es la formulacinde condiciones en cualquiera de las estructura lgica estructuras lgicaspermitidas en PERL. Las expresiones regulares de comparacin soportan lasiguiente opcin:

    i;formato: /(PATRON)/i. Mediante esta opcin se consigue que lacomparacin entre la variable y el patrn se realize sin importarminusculas o mayusculas.

    Expresiones regulares de sustitucin: Esta herramienta permite cambiar lospatrones de busqueda por caracteres nuevos definidos por el usuario quecomponen el patrn de sustitucin, la sintaxis es la siguiente : valor a sustituir =s/patrn de bsqueda/sustitucin/;

    Dentro de las expresiones regulares de sustitucin encontramos las siguientesopciones:

    opcin: i; formato:(s/PATRON DE BUSQUEDA /SUSTITUCION DESUSTITUCION/i) : funciona de igual manera que en el caso de unacomparacin, ignora las maysculas en el reemplazo.

    opcin: g; formato:(s/PATRON DE BUSQUEDA /PATRON DESUSTITUCION/g) : esta opcin permite reemplazar todas las ocurrenciasdel patrn de bsqueda. En el caso de no emplear esta opcin, lasustitucin se realizar slo con la primera ocurrencia del patrn desustitucin.

    opcin: e; formato:(s/PATRON DE BUSQUEDA/PATRON DESUSTITUCION/e): con esta opcin se puede evaluar la parte de lasustitucin (SUSTITUCION),con valores devueltos por una funcin.

    Expresiones regulares de traduccin: Este tipo de expresiones regularestienen una manera de trabajar muy parecida a la de las sustituciones. En estecaso se trata de comparar uno a uno los caracteres del patrn de bsqueda conlos de la cadena de sustitucin, de modo que cada vez que se encuentra unaocurrencia que coincide con uno de los caracteres del patrn se intercambia porsu correspondiente en la cadena del patrn de sustitucin. La sintaxis general deesta expresion regular es la siguiente: variable =~ tr/(patrn de bsqueda)/(cadena_a_traducir)

    Las expresiones regulares de traduccin no tienen opciones, la busqueda ysustitucin se realiza en el contenido de toda la variable.Pasamos a mostrar un ejemplo que ilustre todo lo anteriormente dicho de lasexpresiones regulares:

  • 5/24/2018 Perl Introduccion

    31/37

    Supongamos que tene una archivo de tipo texto con el siguiente contenido: tres perros tres gatos y tres elefantes.Las siguientes expresiones regulares casuarn los efectos que se especifican:

    open(AR,'prueba.prb')|| die"$!\n";

    while () { if($ = s /tres/ { print "Se ha encontrado la cadena 'tres'";} }

    El segmento de codigo anterior realiza las siguientes operaciones: abre unfichero prueba.prb de tipo texto y lo asigna a la variable AR, trs lo que realizaun bucle while que permite recorrer todo el contenido del fichero. Dentro de estebucle, utilizando la variable predefinida $_ (que guarda el contenido de la ltimalinea del fichero definido como entrada); observa mediante una condicin if si

    dentro del registro existe una cadena igual a 'tres'. Como se ve dentro de lacondicin se utiliza una expresin regular de comparacin que devolvera ciertosi se encuentra la cadena patrn dentro de la variable ( en este caso elcontenido de una lnea). En el caso de que la expresin regular devuelva ciertose indica que se encontr la cadena buscada.

    open(AR,'prueba.prb')|| die"$!\n";while () { $ = s/tres/---/g;

    print; }

    Este ejemplo, entra de manera similar al anterior dentro del fichero prueba.prb,tras lo que sustituye dentro de este fichero todas las ocurrencias de la cadena'tres' por la cadena '---'. Esto se realiza mediante una expresin regular desustitucin. Con esto la salida por pantalla sera la siguiente: --- perros --- gatos y --- elefantes.

    open(AR,'prueba.prb')|| die"$\n";while () { $ = tr/tre/1234/; print; }

    La salida por pantalla de este ejemplo es la siguiente:123s p322os 123s ga1os y 123s 313fan13s.El cdigo anterior realiza una traduccin en el contenido de nuestro ficheroprueba.prb, el cual es abierto de la misma manera que en los otros casos. Como

    se ve en el resultado, cada vez que hay una ocurrencia del caracter 't' este sesustituye por '1', cuando aparace un caracter 'r' la sustitucin se hace por el '2' ypor ltimo cuando aparace un caracter 'e' la traduccin lo sustutituye por el

  • 5/24/2018 Perl Introduccion

    32/37

    tercer valor de la cadena de sustitucin, en este caso 3. El caracter desustitucin 4 es ignorado ya que no tiene correspondencia con ninguno de loscaracteres del patrn (solo hay tres caracteres en el patrn).

    open(AR,'prueba.prb')|| die"$\n";

    while () { $ =~ tr/tre/12/; print; }

    La salida por pantalla de este ejemplo es la siguiente:122s p222os 122s ga1os y 122s 212fan12s.Este ejemplo es identico a el anterior pero en este caso slo tenemos doscaracteres en la cadena de sustitucin. As, cuando el nmero de caracteres enla cadena de sustitucin es menor que el nmero de caracteres del patrn, las

    ocurrencia de los caracteres del patrn que no tienen correspondencia conningn caracter de sustitucin, son intercambiados por el ltimo de loscaracteres de sustitucin.

    Caracteres Especiales.Los caracteres especiales en PERL estn intimamente relacionados con lasexpresiones regulares, ya que estos se suelen usar para denotar ocurrenciascomo fin de linea, comienzo de linea, un tabulador ..., lo cual como se ver esespecialmente prctico dentro de la utilizacin de las expresiones regulares.Estos son los caracteres especiales que pueden utilizarse en PERL:

    Carcter: ^ ; comienzo de linea. Con este caracter expresamos el

    comienzo de una cadena o registro de caracteres. As por ejemplosupongamos que se quiere escribir una variable si en su parte inicial seencuentra la cadena 'XXX'. El fragmento de cdigo en PERL que realizaesto sera el siguiente: if($var =~ /^XXX/) { print $var; }Como se ve en el ejemplo, las expresiones regulares y los caracteresespeciales suelen estar intimamente relacionados.

    Carcter: $ ; final de linea. Paralelamente al caracter anterior este

    expresa el final de una cadena o un registro de caracteres. Asi sideseamos escribir una variable si en su parte final contiene la cadena'END' se escribiria la siguiente expresin regular: if($var =/$END/) { $var; print }

    Carcter: ( ) ; parentesis. Estos se utilizan en PERL para delimitar ciertospatrones de comparacin, para posteriormente aplicarles un operador derepeticin o una referencia de patrn.

    Carcter: [ ] ; corchetes. Se utilizan para delimitar dentro de undeterminado patrn un conjunto de caracteres que pueden encontrarsedentro de la variable afectada por una expresin regular. As por ejemplo,supongamos que en una determinada cadena se quieren sustituir todos

  • 5/24/2018 Perl Introduccion

    33/37

    las ocurrencias de los numeros 1 4 por la cadena 'X_X'. Para realizaresta sustitucin se utilizan los corchetes de la siguiente manera: $var = '1sdffl3l54l6y547'; $var =~ s/[14]/X_X/g; $var; print

    La salida por pantalla del ejemplo sera la siguiente: X_Xsdff1315X_X6y5X_X7Cuando se utiliza el carcter ^ con los corchetes, queremos decir la noexistencia de la cadena que est entre los corchetes. As si nuestroejemplo hubiese sido de esta manera: $var = '1s4s547'; $var =~ s/[^14]/X_X/g; $var; print

    la salida por pantalla sera la siguiente: 1X_X4X_XX_X4X_X

    Carcter: - ; guin. Mediante este carcter denotamos un rango decaracteres o nmeros. Asi por ejemplo, si queremos sustituir en unavariable o texto todas las palabras minusculas por palabras mayusculas lorealizaremos mediante la siguiente expresin regular que intercambiacualquier ocurrencia de un caracter en minuscula por su correspondienteel mayculas:$var = tr/[a-z]/[A-Z]/;

    Carcter: { } ; llaves. Dentro de una expresin regular representa la

    longitud de una cadena. As para referenciar una cadena de caracterescon tres caracteres ? se expresa de la siguiente manera:/?{3}/

    Carcter: . ; punto. Sirve para representar cualquier carcter. Asisupongamos que queremos sustituir los cuatro primeros caracteres deuna cadena: $var = 'Paco Gomez'; $var =~ s/.{4}/Manolo/; print $var;

    as la salida que se obtiene es la siguiente:Manolo Gomez Carcter:\d . Mediante este caracter se significa la existencia de un

    digito. Como ejemplo imaginemos que se quieren sustituir todos losdgitos de una variable por el caracter XXX, lo que se hace de la siguientemanera: $var = '1pikachu2'; $var =~ s/\d/XXX/; print $var;

    la salida por pantalla es:XXXflying burritoXXX

  • 5/24/2018 Perl Introduccion

    34/37

    Los siguientes caracteres tienen un significado paralelo al anterior por loque no se darn ejemplos de ellos:

    Carcter:\w . Expresa un carcter alfanumrico. Carcter:\b . Expresa un espacio en blanco. Carcter:\t . Significa un tabulador. Carcter:\r . Expresa un retorno de carro. Carcter:\n . Significa un final de lnea. Carcter:\s . Expresa un separador de cadena de caracteres.

    Los anteriores caracteres especiales, en su formato en maysculassignifican lo contrario, esto es, \W expresa un carcter no alfanumrico,\D expresa un valor no numerico ... Por ultimo el carcter\ permitereferenciar un caracter especial en PERL como un carcter normal, aspor ejemplo la siguiente sentencia: $var =~ s/\\d/XXX/g;

    nos permite sustituir todas las ocurrencias de la cadena \d por XXX. Sidentro de la expresion regular se hubiese escrito solo \d, la sustitucin serealizara en todos los valores numericos. En general ocurre lo mismo conel resto de caracteres especiales de PERL.

    Operadores de Repeticin.Como los caracteres especiales, tambin seencuentran muy unidos a la aplicacin de las expresiones regulares. En estecaso, este tipo de operadores nos permiten repetir un nmero determinado deveces una cadena de caracteres dentro de una expresin regular.Los operadores de repeticin son los siguientes:

    Operador: * ; con l podemos representar un patrn 0 ms veces. As

    supongamos que se quieren sustituir en una cadena todas las ocurrenciasde la expresion 'EO' al final de una cadena de caracteres por 'XX',demodo, que a priori no podemos conocer el nmero de ocurrencias de'EO'. Para resolver este problema se utilizar el operador * de la siguientemanera: $var = 'EOpikachuEOEOEO'; $var =~ s/(EO)*$/XX/; print $var;

    La salida de este programa en PERL es la siguiente:EOpikachuXX

    Como se observa, ha sustituido un nmero indeterminado de ocurrenciasde 'EO' al final de la cadena por una sola ocurrencia de la cadena 'XX'. Sino se hubiese utilizado el operador '*' junto con el carcter especial '$', lasentencia habra sustituido todas las ocurrencias de EO por XX. Como seobserva en este ejemlo se utilizan los parentesis para indicar que laoperacin de repeticin afecta a la cadena EO por entero, de no haberseutilizado los parentesis la repeticin afectaria unicamente al caracter O.

    Operador: + ; este operador funciona de manera similar que el operador'*', pero con la diferencia de que el patrn es representado una o masveces.

    Operador: ? ; mediante este operador representamos una cadena decaracteres opcional dentro de un patrn. As si se quiere sustituir lacadena 'usted' y su plural por la cadena '---' se puede realizar el siguientecodigo en PERL:

  • 5/24/2018 Perl Introduccion

    35/37

    $var =~ s/usted(es)?/---/;

    con esto consiguimos sustituir todas las ocurrencias de la cadena usted oustedes por '---'.

    Referencia a patrones.Se utilizn para referenciar patrones de comparacin osustitucin en las expresiones regulares. PERL trabaja con dos tipos deoperadores de comparacin:

    Operador: $1..9 ; sirven para referenciar uno de los patrones de bsqueda de laexpresin regular. El nmero del 1 al 9 representa el patrn al que queremosnos referimos dentro de la expresin regular. As un ejemplo del uso de esteoperador se puede observar en este cdigo en PERL que aade el articulo 'El' aun nombre comn: $var = 'PERRO'; $var =~ s/(PERRO)/EL $1/; print $var;

    Como se observa utilizamos la referencia $1 para referirnos al primer patrn debsqueda (la cadena `PERRO` en nuestro caso) dentro del apartado dedicado alos patrnes de sustitucin, de modo que dentro de la sustitucin se encuentra elpatrn de busqueda. Despus de la ejecucin la variable $var tiene la siguientecadena:EL PERRO

    Operador:\1..9 ; este operador tiene la misma utilidad que el anterior, esto es, seutiliza para referenciar patrnes de busqueda, pero en este caso la referencia se

    reliza en la parte de la expresin regular que se dedica a la escritura de patronesde bsqueda y no en la parte dedicada a los patrnes de sustitucin, como en elformato anterior. As para evaluar el principio y el final de una cadena se escribeel siguiente codigo: if($var =~ /^(\w)+.*\1$/);

    Esta expresin regular de comparacin tiene el siguiente significado: mediante lacadena ^(\w)+ nos referimos a todos los caracteres alfanumricos que formanparte del principio de la cadena contenida en $var, esto es tomo como primerpatrn todos los carcteres alfanumricos de la cadena; con la cade .* referencio

    un conjunto arbitrario de caracteres de longitud desconocida; con la cadena \1expreso el primer patrn utilizado y con $ significo que este patrn debe de estaral final de la cadena contendia en $var. En definitiva la expresin regular tomarel valor cierto, cuando la cadena de caracteres contenida en $var tenga lamisma cadena de caracteres alfanumricos al principio y al final. As porejemplo, si $var tiene una cadena de caracteres como esta: 'hola juansdfa hola'el valor de la expresin regular ser cierto, ya que los espacios en blanco no seconsideran caracteres alfanumricos.

  • 5/24/2018 Perl Introduccion

    36/37

    ALGUNAS FUNCIONES DE PERL

    A continuacin se describen algunas de las funciones ms utilizadas en laprogramacin de un perl script, esto no pretende ser un manual de referencia luego

    para conseguir el formato puedes usar el comando man perl: abs: devuelve el valor absoluto de la expresion pasada. chmod: cambia los permisos de los ficheros dados. chop: recorta y retorna el ltimo carcter de una cadena. chown: cambia el propietario de los ficheros dados. close: cierra un fichero. cos: devuelve el coseno del angulo dado en radianes. defined: sirve para comprobar si existe una variable,formato, subrutina,etc.. delete: borra un valor de un array asociativo a traves de su clave. die:imprime en la salida del error estandar un mensaje pasado como parametro

    cuando ocurre un error en la ejecucion de una sentencia. eof: retorna verdadero si el final del fichero dado. eval: evalua la expresin pasada como si se tratase de un pequeo programa

    perl. exec: ejecuta lo que pasemos como parametro y sale del programa. exit: hace que salgamos del perl script devolviendo al sistema operativo el valor

    pasado como argumento. exp: retorna el numero e elevado a la potencia pasada como parametro. fileno: devuelve el descriptor del manejador del fichero pasado como parametro. fork: realiza una llamada fork. getc: lee el siguiente caracter del fichero especificado. hex: devuelve el valor decimal del numero hexadecimal pasado como

    parametro. index: devuelve la posicion de la primera ocurrencia de una cadena en otra. int: devuelve la parte entera del parametro pasado. join: une las cadenas pasadas como argumento con un separador tambien

    pasado como argumento. keys: devuelve todas las claves de un array asociativo. length: devuelve la longitud en caracteres del parametro pasado. local: declara como locales las variables pasadas como argumentos. log: devuelve el logaritmo del numero dado. mkdir: crea un directorio en el camino dado. oct: devuelve el valor decimal del numero octal pasado como parametro. open: abre el fichero fichero dado asociandole un manejador de fichero

    especificado tambien como parametro. pop: retorna y borra el ultimo elemento del array dado. print: muestra en la salida standard o en el fichero especificado la expresion

    dada. push: aade el valor dado al final del array pasado como parametro. rand: devuelve un numero aleatorio entre 0 y el valor pasado como argumento. read: lee un determinado numero de caracteres desde el fichero pasado como

    argumento. rename: sirve para renombrar un fichero. require: sirve para incluir codigo externo en nuestro guion.

  • 5/24/2018 Perl Introduccion

    37/37

    return: devuelve un valor desde una subrutina. rmdir: borra un directorio. seek: situa un puntero a fichero en un lugar determinado. select: sirve para seleccionar el manejador de fichero que sera utilizado por

    defecto para la salida de los comandos o funciones que no especifiquen un

    determinado manejador de fichero como parametro. shift: devuelve el primer valor del array dado borrandolo posteriormente. sin: devuelve el seno del angulo pasado en radianes. sleep: causa que el perl script o guion se detenga el numero de segundos

    especificados. sort: ordena el array dado. split: divide una cadena en subcadenas segun el separador especificado. sqrt: devuelve la raiz cuadrada del numero pasado. system: igual que exec pero no se sale del perl script. tell: devuelve la posicion actual del puntero a fichero del manejador de fichero

    especificado. values: devuelve todos los valores del array asociativo dado. write: escribe un registro con formato en el fichero asociado a ese formato.

    Este ha sido un breve repaso a lo que es el lenguaje PERL, su sintxis, susfunciones y sus caractersticas en general.