El lenguaje Perl


  • Qué es Perl
  • Cómo Ejecutar Perl
  • Entradas, Salidas y Ambiente
  • Términos y Estructura Lógica
  • Términos Reservados
  • Definición de Variables
  • Expresiones Regulares
  • Funciones
  • Utilidades
  • Otros Documentos

  • Qué es Perl

    Perl es un lenguaje de programación, estructurado en el lenguaje 'C', está diseñado para facilitar la manipulación de textos, archivos y procesos.

    Algunas de las principales facilidades del lenguaje PERL son:

  • Permite construir filtros, para seleccionar información desde un archivo cualquiera, empleando expresiones regulares de búsqueda.
  • Permite una comunicación interactiva, por medio de comandos ejecutados en el sistema operacional.
  • Puede emplearse en cualquier linea de un programa estructurado en cualquier ambiente, sin problemas de ejecución.
  • Al igual que cualquier script de los diferentes interpretadores de comandos (Shells), permite almacenar y ejecutar sin problema un script en particular desde el sistema operativo.
  • Permite la manipulaci`on de la estructura de cualquier archivo en el ambiente Unix. Toda la traducción Lógica de Oracle Libraries, se estructuró en scripts elaborados en PERL, sus resultados fueron excelentes y la traducción fue exitosa.

  • Cómo Ejecutar Perl

    Para ejecutar un programa en perl basta crear un archivo en el sistema operativo con permisos de ejecución en ingresar como primer entrada (primera linea) la siguiente instrucción :

      #!/usr/local/bin/perl
    

    donde los caracteres #! indican que los caracteres siguientes representan un interpretador de comandos, la ruta (path) /usr/local/bin determina el directorio donde se encuentra el interpretador de comandos, posteriormente el nombre del interpretador de comandos, para el caso del lenguaje perl se denomina perl. Para encontrar la ruta de perl se emplea el comando del sistema operativo which de la siguiente forma :

      which perl
    

    Una vez creado el archivo con la primera linea en seguida se escribe el programa y posteriormente se ejecuta.

    Cuando se emplean argumentos en un programa como en el siguiente caso :

      programa.pl argumento1 argumento2 
    

    Los argumentos se almacenan en el vector posición @ARGV, para posteriormente manipularlos en el codigo del programa, ejemplo :

      sumar.pl 1 2
    

    Para extraer los 2 números dados como argumentos iniciales, se emplea la función shift de la siguiente forma :

      $variable  = shift(@ARGV);
      $variable2 = shift(@ARGV);
    
    o simplemente
    
      $variable  = shift;
      $variable2 = shift;
    
    ya que la función shift actua por defecto sobre @ARGV
    

    En el anterior caso $variable toma el valor de 1 y $variable2 toma el valor de 2. Cuando de concatena una una comando del sistema operativo con un programa en perl, ya sea como entrada o ya sea como salida, la información se manipula dentro del programa con los archivos especiales STDIN para la información de entrada y STDOUT para la información de salida, ejemplo :

     cat archivo | programa.pl
    

    En el anterior caso se emplea el comando del sistema operativo cat, el cual suministra toda la información de 'archivo' y se concatena con un programa en perl que se denomina 'programa.pl', el cual recibe la información en el archivo especial STDIN.

      programa1.pl | programa2.pl
    

    En el anterior ejemplo se emplea un programa en perl 'programa1.pl' para suministrar la información a otro programa en perl 'programa2.pl', en primer programa la infromación se suministra en el archivo especial STDOUT y el segundo archivo se recibe en el archivo especial STDIN.


    Entradas, Salidas y Ambiente en Perl

    A continuación se presenta la descripción de la entradas, salidas y ambiente manipulado en el lenguaje perl

  • Entradas : Las entradas en perl, es el sumnistro de la información ya sea por medio de la función open o por medio de la entrada estandar denominada STDIN, este archivo especial se emplea para manipular la información proveniente de la línea de comando o en alguno de los casos del teclado, ejemplo :
    si se ejecutara en el sistema operativo 'cat archivo | programa.pl'
    
    y en programa.pl se emplara las siguientes intrucciones :
    
      while (<STDIN>) {
         print;
      }
    
    La infromación proveniente de 'archivo' dirigida por el comando 
    'cat' se manipula en un ciclo 'while' se imprime en pantalla.
    

    De esta forma se emplea la entrada estandar STDIN en el flujo de información del lenguaje perl.

  • Salidas : Las salidas en perl se emplean por medio de la función open o por la salida estandar denominada STDOUT, este archivo especial manipula toda la información que saldrá durante la ejecución del programa, si no se define con la función open o en le definición de un reporte la salida estandar STDOUT, la información que se imprimirá con la función print saldrá directamente a pantalla si no existe ninguna concatenación a otro programa u otro comando en la línea de comandos, de lo contrario se direccionará al comando o a otro programa que se concatene en le ejecución desde la línea de coamando, ejemplo :
      open (ARCH, '/etc/passwd') || die "$!\n";
      while (<ARCH>) {
         print STDOUT;
      }
    
    la instrucción 'print STDOUT;' se resume a 'print;' puesto que la
    función print imprime por defecto en STDOUT
    

    De este forma la información proveniente del archivo especial ARCH se imprime por medio de la función print en la salida estandar STDOUT, la cual saldrá en pantalla.

  • Ambiente : el ambiente en el lenguaje perl se manipula por medio del vector asociado %ENV, cuyas claves pertenecen a la varibale de ambiente y su valor al valor de dichas varibales, por ejemplo :

    Si se quiere imprimir el valor de la varibale de ambiente PATH, dentro de un programa en perl, se emplea la siguiente instrucción :

      print "$ENV{'PATH'}\n";
    
    donde '\n' representa un fin de línea 
    

    Además de las entradas y salida dentro de un programa y el ambiente se emplea los argumentos los cuales se almacenan en el vector posición @ARGV, de esta forma se puede manipular cualquier argumento que acompan~e en la ejecución desde la linea de comandos al programa en perl, ejemplo :

    Si se quiere imprimir los 2 primeros argumentos incluyendo el nombre del programa, se realiza de la siguiente forma :

      print "Programa    : $ARGV[0]\n";
      print "Argumento 1 : $ARGV[1]\n";
      print "Argumento 2 : $ARGV[2]\n"; # donde '\n' es un fin de línea
    

    si se ejutara 'programa.pl hola mundo', la impresión sería :

      Programa    : programa.pl
      Argumento 1 : hola
      Argumento 2 : mundo
    

  • Términos y Estructura Lógica

    Es necesario conocer algunas reglas y términos que rigen en la creación de programas en en el lenguaje perl que a continuación se presentan:

  • Comentario : este t`ermino es muy útil el cualquier lenguaje de programación ya que permite documentar todos los desarrollos que se encuentran dentro de los programas, estos términos hacen parte del programa pero que no tienen validez en la ejecución de ellos, en perl los comentarios se definen con el simbolo "#".
  • Comienzo de bloque : este término se emplea para representar la iniciación de un grupo de instrucciones perteneciente a un procedimiento específico, en perl el comienzo de bloque se simboliza por "{".
  • Fin de bloque : este t`ermino se emplea para representar la finalización de un gupo de instrucciones pertenecientes a un procedimiento específico, en perl el final de un bloque se simboliza por "}".
  • A continución se muestra un ejemplo de los términos anteriores :
     encabezado del procedimiento { # comienzo de bloque
    
      .....                         # grupo de instrucciones
    
     }				# fin de bloque
    

    En el anterior ejemplo se empleó el símbolo "#" para escribir la explicación de los términos empleados, de esta manera se utiliza los comentarios para documentar los programas en perl.

    Para facilitar la representación de un bloque equivalente a un comienzo de bloque, un grupo de instrucciones y un fin de bloque (Ver ejemplo anterior), se le denominará BLOQUE en el contexto del este manual.

  • Fin de instrucción : cada instrucción en perl se finaliza con el carater ";", como en el siguiente caso :
      print "Hola\n" ; # se Imprime 'Hola' con un fin de linea
    	         ^ -> caracter de finalización
      &sumar ;         # se ejecuta la subrutina 'sumar'
                 ^ -> caracter de finalización
    

    En el anterior ejemplo se muestra dos instrucciones las cuales se determinan explícitamente con el caracter de finalización ";".

  • ' : la comilla simple se emplea para denotar una cadena de carcateres, si se quisiera asignarle la cadena 'aaa' a una variable se hiciera de la siguiente forma :
      $variable = 'aaa';
    
  • " : la comilla doble se emplea para denotar cadenas de caracteres pero incluyendo caracteres especiales o términos reservados dentro de su contexto, ejemplo :
      $variable  = 'aaa';
      $variable1 = "$variable xxxxx \n";
      $variable2 = '$variable xxxxx \n';
    
    El valor de variable1 sería igual a 'aaa xxxxx ' y además 
    un fin de linea (\n equivale a un fin de linea)
    
    El valor de varibale2 sería igual a '$variable xxxxx \n'
    ya que se empleó comillas sencilas (' ') las cuales
    no aceptan el valor de términos ni caracteres especiales.
    
  • ` : este tipo de comillas se emplea para ejecutar un comando del sistema operativo, ejemplo :

    Si se quisiera ejecutar 'cat archivo' en el sistema operativo y la salida asignarla a una variable se haría de la siguiente forma :

    $variable = `cat archivo`;

  • Estructura lógica : en el lenguaje perl se emplea los modos logicos si (if), de lo contrario condicional (elsif) como determinante (else), mientras (while), a menos (less), para cada (foreach) , continue (continue), estos modos lógicos se muestran a continuación:
  • while (condición) BLOQUE : permite realizar el grupo de instrucciones mientras la "condición" retorne un valor verdadero.

    Si condición equivale a un archivo especial manipula toda la información representada en el archivo por medio de registros de entrada ($_)

  • if (condición) BLOQUE : permite realizar un grupo de de instrucciones siempre y cuando la "condición" retorne un valor verdadero. cuando se combina con las instrucciones lógicas elsif (condición) BLOQUE y else (condición) BLOQUE se emplea para evaluar varias alternativas; es el caso cuando se evalua un valor ya sea negativo, positivo o cero, en estos casos existe un único evento verdadero, por lo tanto se empleará una cadena lógica empesando por a evaluar si es negativo (if) de lo contrario si es cero (elsif) o por último, si las evaluaciones anteriores no son verdad se concluye que el valor es positivo, (else), de esta forma se construir`ia la evaluación lógica :
     if    ($variable > 0) BLOQUE   # si el valor es negativo
     elsif ($variable == 0) BLOQUE  # si el valor es cero
     else  BLOQUE    # se concluye que el valor es positivo
    

    Para el caso anterior la última evaluación se la realiza pero sin determinar ninguna condición, dando lugar a ejecutar instrucciones cuando todas las evaluaciones "if" y "elsif" dan como resultado un valor falso.

  • less (condición) : esta evaluación lógica permite descartar la ejecución de un grupo de instrucciones cuando se cumple una condición; es el caso cuando se realiza la división de 2 números, la división se indetermina cuando el valor del número por el cual se va a dividir es cero, si se quiere generar un codigo perl que evaluae esta división siempre y cuando el segundo valor no sea cero se tendría :
       # $variable y $variable2 son los valores a dividir
       # $variable2 es el valor que no debe ser cero
    $division = $variable/$variable2 less ($b == 0) ;
    

    En el anterior ejemplo el valor que toma $division sera el resultado de la división entre $variable y $variable2 siempre y cuando $b no tenga el valor de cero.

  • foreach variable (LISTA) BLOQUE : este modo de ejecución se emplea para realizar un serie de instrucicon en una lista de valores, es el caso de la suma de un grupo de números de 1 al 10, como se muestra a continuación:
    foreach $valor (1..10) {
      $variable = $variable + $valor;
    }
    

    En el caso anterior la variable $valor toma el de cada uno de los elementos del 1 al 10 y se lo adiciona a la variable $varibale.

  • do BLOQUE until (condición) : Esta estructura permite ejecutar un grupo de instrucciones, hasta que se cumpla un condición.
  • for : este modo de ejecución se emplea para realizar un cliclo de instrucciones dependiendo de un rango determinado, por ejemplo si se quiere ejecutar un grupo de intrucciones por 5 veces se haría :
      for (1..5) {
        ...        # grupo de instrucciones
      }
    
  • Subrutina : Una forma de ejecutar un estructura en perl, es empleando las subrutinas, las cuales se conforman por una parte de estructura perl que permite realizar ciertas funciones que se pueden emplear en la ejecucuión de el programa principal. Es el caso de una subrutina empleada para ingresar un valor por medio del teclado cada vez que sea necesario, la definición de la anterior subrutina es la siguiente :
     sub ingreso {    # definición de la subrutina
      local ($variable); # declara la variable local $variable
      $variable = <tty> # asigna a $valor lo digitado en pantalla
      return $variable; # retorna el valor de lo digitado
     }
    

    Para ejecutar la subrutina anterior simplemente se emplea el caracter "& " precedido del nombre de la subrutina, para el caso anterior si se quiere asignar el valor retornado por la subrutina a una variable en cualquier parte del programa se haría de la siguiente forma :

    	$variable = &ingreso;
    
  • Operadores Lógicos : los operadores lógicos permiten evaluar si una condición es verdadera o falsa cuando existen 2 o mas eventos, es el caso de el valor de una variable, puede ser positivo o negativo, o el caso del dos variables, ambas pueden ser positivas y así como estos 2 ejemplo de eventos pueden exitir muchos mas; en perl se puede evaluar o crear una condición utilizando los operadores lógicos, y de esta forma se puede crear una condición con los valores verdaderos, falso y los operadores lógicos :

    A continuación se presentan los diferentes operadores lógicos empleados en perl :

    1. | : este operador es el operador lógico 'o', empleado en las expresiones regulares para evaluar 2 eventos de comparacion, los cuales generan un valor lógico verdadero o falso, para que la condición se cumpla por lo menos alguno de los 2 eventos se debe cumplir, ejemplo :

      se debe realizar un grupo de instrucciones si en $variable existe la cadena de caracteres 'Hola' o la cadena 'Saludo', la forma siguiente permite evaluar esta esta condición :

       if (variable =~ /Hola/|/Saludo/) {#compara 'Hola' o 'Saludo'
         .....
       }
      

      Ademas de actuar sobre expresiones regulares este operador se emplea para evaluar eventos que involucren valores de variables, ejemplo :

      Se quiere evaluar si $variable equivale a 5 'o' $varibale es menor que 1, el operador "|" actua de la siguiente forma :

        if ($variable == 5 | $variable < 1) { ....
      
    2. || : Al igual que el operador anterior trabaja como un operador lógico 'o', pero con la diferencia de que este operador trabaja sobre instrucciones y no en expresiones regulares como en el caso anterior, para este operador ejecuta el primer grupo de instrucciones que se pueda ejecutar o retorne un valor verdadero, ejemplo :

      Normalmente en perl se emplea este operador cuando se quiere abrir un archivo y desplegar en pantalla el error cuando no se puede ejecutar, el operador evalua la apertura del archivo, si este se puede abrir continua y no realiza la otra instrucción, si po algun motivo no se puede abrir el archivo ejecuta la segunda instruccion que retorna en pantalla el error de apertura, de esta forma :

        open (ARCH,'texto'); # se abre el archivo 'archivo'
        die "Error en apertura : $!\n"; # imprime el error de salida
      

      Para evaluar las dos intrucciones con el operador "||" sería :

        open (ARCH,'texto') || die "Error en apertura : $\n";
      

      De esta forma se verifica el error cuando no se puede abrir un archivo

    3. ^ : este operador permite verificar en expresiones regulares si dos eventos se cumplen de una manera exclusiva, la evaluación retorna verdadera si alguno de los dos eventos ocurre, si por el contrario ambos retornan un valor vardadero o ambos retornan un valor flaso el operador retornara un valor falso, ejemplo : si se quiere encontrar en un variable 2 cadena de caracteres mutuamente exclusivas, alguna de ellas debe estar presente pero no las dos al mismo tiempo, esta condición se puede evaluar de la siguiente forma :
        if ($variable =~ /cadena1/^/cadena2/) { ...
      

      El operador "^" tambien se lo emplea para evaluar valores de varibles.

    4. & : este operador trabaja como un operador lógico 'y' en expresiones regulares, permite confrontar 2 eventos los cuales deben retornar valores verdaderos para que este operador retorne un valor verdadero, o tambien permite evaluar eventos que involucren valores de variables, ejemplo:

      se quiere ejecutar un grupo de instrucciones si exite en $variable la cadena de caracteres 'XXX' y el valor de $variable2 equivale a 5; la anterior condición se la evalua de la siguiente forma :

        if ($variable =~ /XXX/ & $variable2 == 5) { ..
      
    5. && : Al igual que el operador anterior trabaja como un operador lógico 'y', pero con la diferencia de que este operador se emplea sobre instrucciones y no en expresiones regulares como en el caso anterior, para este operador todas las instrucciones deben ejecutarse o de lo contrario ninguna se ejecutar`a, ejemplo :

      Se quiere incrementar el valor de $variable si sólo se puede abrir el archivo 'TEXTO', en este caso las intrucciones se ejecutan de la siguiente forma :

        open (ARCH,'TEXTO') && ++$variable;
      

      Si se involucra mas de 2 instrucciones, se ejecutarán si y solo si todas se puedan ejecutar.

    6. ! : este operador permite realizar una evaluación negativa de un evento, ejemplo :

      Se quiere realizar un grupo de intrucciones si no existe $variable :

        if (! $variable) {
          ...
        }
      
  • Operadores de Archivo : estos operadores se emplean para verificar en el sistema operativo los permisos de un archivo, o su naturaleza, de ejecución, texto plano, etc. A continuación se muestra los diferentes operadores :
    1. -r : indica si el archivo tiene permiso de lectura, ejemplo :
        if (-r $variable) { # verificación
          print "$variable : de lectura\n";
        }
      
      Donde $variable es la variable donde se almacena el nombre del archivo.
      

      De esta forma se emplean todas las opciones que se describen mas adelante :

    2. -w : indica si el archivo tiene permiso de escritura
    3. -x : si el archivo tiene permiso de ejecución
    4. -T : si el archivo es tipo texto
    5. -e : si el archivo existe
    6. -z : si el archivo tiene taman~o cero
    7. -s : si el archivo no tiene taman~o cero
    8. -f : si el archivo es plano
    9. -d : si es un directorio
    10. -l : si es un enlace simbólico
    11. -t : si el objeto está abierto en una terminal
    12. -B : si es binario (opuesto a -T)
    13. -M : número de días después de la última modificación, ejemplo :
        $variable = -M '/etc/format';
      

      En el anterior caso $a obtiene el valor en dias a partir de la última modificación del archivo '/etc/format';

    14. -A : número de días después del último acceso (última lectura)
    15. -C : número de días después del último cambio

  • Términos Reservados

    En perl los términos reservados son caracteres o conjunto de caracteres que simbolizan una asignación, una operación o un evento específico, estos términos se los muestra a continuación :

  • Términos de Asignación
  • Términos de Operación
  • Términos de Comparación
  • Términos de Evento

  • Términos de Asignación

    Los términos descritos a continuación se emplean para dar valores a cualquier variable en perl :

    = El término `igual` se emplea para asignarle un valor a la expresión que se encuentre en su extremo izquierdo con el resultado de la expresión que se encuentre en el extremo derecho; este operador es muy útil para inicializar valores de varibles o para la aplicación de cualquier función a una variable, ejemplo :

      $variable = 'hola mundo';   # inicialización de variable
      $variable = chop($varibles) # aplicación de una función
    
    =~
    Este término se emplea para aplicar una expresión regular a cualquier expresión que se encuentre en el extremo izquierdo del término, ejemplo :
     $varible =~ s/HOL/sss/; # reemplaza HOL x sss en $variable
    

    Los siguientes términos de asignación combinan un término de operación y el caracter '=', con el fin de ejecutar dos eventos específicos, la regla que se muestra a continuación representa la interpretación de estos términos :

     $varibale OPCION= valor; # donde opción puede ser 
    			  # ( +, ., |, &, %, <<, >> , *, **, -)
    

    Cada opción representa un término de operación los cuales permiten definir la operación que se realiza conjunto con la asiganción, esta clase de términos equivale a realizar la asignación y la operación explícitamente de la siguiente forma :

     $variable = $variable OPCION valor; 
    

    Como se puede verificar el término de operación representado por la OPCION actua sobre $variable y valor y posteriormente el resultado se lo asigna a $variable, de esta forma se explica el funcionamientos de los términos de asignación compuestos de la forma mensionada anteriormente.

    A continuación se presenta los diferentes términos de esta naturaleza :

    1. += : asignación y adición; este término se emplea para adicionarle cierto valor a una variable, ejemplo :
        $variable = 5;
        $variable += 6; # el resultado se $variable es 11
      
    2. -= : asiganción y sustracción; funciona de igual forma que el término anterior, pero en este caso restando, ejemplo :
        $variable = 10;
        $variable -= 6; # el resultado de $variable es 4
      
    3. .= : asignación y concatenación; este término se emplea para adicionarle a un valor una cadena de caracteres, ejemplo :
        $variable  = 'Hola ';
        $variable .= 'Mundo'; # el resultado de $varibale es 'Hola Mundo'
      
    4. **=: asiganción y exponenciación; eleva la expresión del extremo izquierdo a la potencia del extremo derecho, asignandole el resultado a la expresión del extremo izquierdo, ejemplo :
        $variable = 5;
        $variable **= 2; # el resultado de $variable es 25
      
    5. *= : asignación y multiplicación; funciona de igual manera que el término anterior pero multiplicando los valores de los extremos, ejemplo :
        $variable = 5;
        $varibale *= 2; # el resultado de $variable es 10
      
    6. /= : asiganción y división; de igual forma que el término anterior pero dividiendo los dos extremos, ejemplo :
        $variable = 10;
        $variable /= 2; # el resultado de $variable es 5
      
    7. %= : asiganción y modulo; este término se emplea para determinar el módulo de la dicisión entre las expresiones de los dos extremos, ejemplo :
        $variable = 5;
        $variable %= 2; # el resultado de $variable es 1
      
    8. <<= : asignación y crecimiento binario; este término permite generar una progresión geométrica binaria a partir del valor de la expresión del extremo izquierdo, ejemplo :
       5, 10, 20, 40, 80 # progesión geométrica binaria a partir de 5
       3, 6, 12, 24, 48  # progesión geométrica binaria a partir de 3
      
       $variable = 5;
       $variable <<=3; # retorna el tercer termino de la
      	         # progresión geometrica binaria
      	         # a partir de 5, en este caso 20
      
    9. >>= : asignación y decrecimiento binario; este término funciona de igual forma que el anterior pero generando una progresión del resultado de la división entre la expresión del extremo izquierdo por 2, un número de veces especificado por el valor del extremo derecho, ejemplo :
       100, 50, 25, 12, 6 # progresión geometrica binaria decreciente
      
       $variable = 70
       $variable >>= 3 # retornará el tercer término
      	         # de la progresión  progresión
      	         # geométrica binaria, en este caso 17
      
    10. |= : asignación y comparación binaria; este término se emplea para realizar una comparación logica 'o' entre los valores binarios de dos números, los cuales estan representados por los valores de los dos extremos del término, ejemplo :
        2  valor binario es   1 0
        3  valor binario es   1 1
      La comparación lógica 'o' entre binarios sigue la regla :
        1 o 1 = 1
        1 o 0 = 1
        0 o 1 = 1
        0 o 0 = 0
      En el caso anterior la comparación lógica 'o' entre 
      2 y 3 da como resultado :
          1 0
          1 1
        =======
          1 1	  -> cuyo valor en decimal es 3 
      
      En, perl :
        $variable  = 2;
        $variable |= 3; # el resultado de $variable es 3
      
    11. &= : igual que en el caso anterior pero con la comparación logica 'y', ejemplo :
      La comparción lógica 'y' entre binarios sigue la siguiente regla :
        1 y 1 = 1
        1 y 0 = 0
        0 y 1 = 0
        0 y 0 = 0
      En el caso de comparar 2 y 3 el resultado sería 
          1 0
          1 1
        =======
          1 0    -> cuyo valor en decimal es 2
      
      En perl :
        $variable  = 2;
        $variable &=3 # el resultado de $variable es 2
      

    Términos de Operación Estos términos permiten desarrollar operaciones a las expresiones o variables presentes en cualquier instrucción de perl :

    Las operaciones matemáticas fundamentales adición, sustracción, multiplicación y división se pueden aplicar en perl con los simbolos + , - , * y / respectivamente.

    A continuación se presentan cada uno de los términos de operación empleados en perl :

    **
    Este término se emplea para obtener la potencia de un valor numérico, ejemplo :
     $variable = 5;
     $variable**2;  # eleva $variable al cuadrado
    		# el resultado será 25
    
    .
    Este término se emplea para concatenar dos cadenas de caracteres, ejemplo:
      $variable = 'Hola';  # asigna a $variable 'Hola'
      $variable.' Mundo';  # concatena a $varibale ' Mundo' 
                           # el resultado sera 'Hola Mundo'
    
    x
    Este término multiplica n veces la cadena de caracteres especificada. ejemplo :
       '-' x 80; # equivale a una cadena de 80 caracteres '-' 
    
    %
    Permite obtener el modulo de la división entre dos números, ejemplo :
      $variable = 5 % 2; # el resultado de $variable es 1
    
    |
    Este término cuando se lo emplea entre 2 valores numéricos, permite realizar una compración 'o' binaria entre ellos, ejemplo :
      $variable = 3 | 2 # el resultado de $variable es 3
    
    &
    Este término cuando se lo emplea entre 2 valores numéricos, permite realizar una compración 'y' binaria entre ellos, ejemplo :
      $variable = 3 & 2 # el resultado de $variable es 2
    

    Términos de Comparación Los términos de compración permiten confrontar dos expresiones y generar un resultado ya sea lógico o numérico, estos términos se describen a continuación :

    ==
    Término empleado para comparar dos valores num`ericos iguales, el resultado de la compración es un valor lógico, verdadero o falso, ejemplo :
      if ($variable == 1) { # evalua si $variable es 1
         ......
      }
    
    eq
    Se emplea para comparar dos cantidades iguales no numéricas, ejemplo :
      if ($variable eq 'ww') { # evalua si $variable es 'ww'
         ......
      }
    
    !=
    Este operador se emplea para comparar dos cantidades numéricas diferentes, ejemplo :
      if ($variable != 1) { # evalua si $varibale es diferente de 1
        .....
      }
    
    ne
    Se utiliza para comparar dos cantidades no numéricas diferentes, ejemplo :
      if ($variable ne 'ww') { # evalua si $variable es diferente a 'ww'
        ......
      }
    
    <
    Este término se emplea para verificar el taman~o de una cantidad numérica con respecto al valor del extremo derecho, funciona como el operador matemático menor que, ejemplo :
      if ($variable < 1) { # verifica si $variable es menor que 1
        ......
      }
    
    >
    Este término se emplea para verificar el taman~o de una cantidad numérica con respecto al valor del extremo derecho, funciona como el operador matemático mayor que, ejemplo :
      if ($variable > 1) { # verifica si $variable es mayor que 1
        ......
      }
    

    Para los términos menor o igual y mayor o igual se emplean los términos : <= y >l respectivamente.

    lt
    Este término se emplea para comparar según el orden dos cadenas de caracteres no numéricas, verifica si la cadena del extremo izquierdo es menor en orden que la cadena del extremo derecho, ejemplo :
      'a'  lt 'b' # verdadero
      'aa' lt 'b' # verdadero
      'ba' lt 'b' # falso
    
    gt
    Este término se emplea para comparar según el orden dos cadenas de caracteres no numéricas, verifica si la cadena del extremo izquierdo es meyor en orden que la cadena del extremo derecho, ejemplo :
      'b' ge 'a'  # verdadero
      'b' ge 'aa' # verdadero
      'b' ge 'ba' # falso
    

    Para los términos menor o igual y mayor o igual en cantidades no numéricas se emplean los términos : le y ge respectivamente.

    cmp
    Término empleado para comparar caracteres, retorna -1, 0, 1 ; en el caso de que los caracteres comparados sean iguales, retorna 0, en el caso de que el primer patrón de la comparación se encuentre al comienzo del otro patrón retorna 1, de lo contrario retorna -1. ejemplo:
      'hola' cmp 'hola'            # retorna 0 
      'holas chicas' cmp 'hola'    # retorna 1 
      'hey hola' cmp 'hola'        # retorna -1
      'hey hola chicas' cmp 'hola' # retorna -1
      'algo diferente' cmp 'hola'  # retorna -1
    
    <=>
    operador para comparar valores numéricos, retorna -1, 0, 1; en esta comparación si el número comparado es igual al patrón de comparación retorna 0, si el número del patrón comparado es mayor que el número del patrón a comparar retorna 1, de lo contario -1. ejemplo:
     12 <=> 12               # retorna 0  
     12 <=> 13               # retorna 1  
     12 <=> 11               # retorna -1 
    
    =~
    Este térmico se emplea tanto para asignar (ver Términos de Asignación)) como para comparar la existencia de patrones de compración (ver Expresiones Regulares), en este caso se mostrará la utilización de este término como una comparación, ejemplo :
      if ($varible =~ /HOl/) { # verifica si $varible contiene 'HOl'
        .....
      }
    
    !~
    Este término se emplea para negar la existencia de un valor, utilizando expresiones regulares, como se muestra a continuación :
      if ($variable !~ /HOl/) { # verifica si $varibale no contiene 'HOl'
        .....
      }
    
    ..
    Este término actua sobre rangos. ejemplo :
      if (100..103) { # verifica si esta entre 100 y 103
        ....
      }
    

    Términos de Evento Cada uno de estos términos de evento tienen un significado muy espcial en perl, ya que representan las convenciones propias del lenguaje que permiten manipular la información procesada en cualquier programa. Para lograr entender estos términos de eventos es necesario conocer donde se emplean; algunos de estos términos son muy útiles en la manipulación de archivos, cuando se habla de manipular un archivo se refiere a manejar información que se tiene en ellos, modificarla o transformarla con la aplicación de instrucciones propias de perl. Para realizar esta manipulación es necesario abrir los archivos como se muestra en la función open(), una vez que se abre el archivo y se asigna a una variable, se puede dar inicio a la manipulación, para el ejemplo se abrirá el archivo 'prueba' y se asignará al manejador 'ARCH' de esta forma :

      open(ARCH,'prueba');
    

    Posteriormente se manipulará la información del archivo en un ciclo "while" denotado de la siguiente forma :

      while (<ARCH>) {
        ....		 # grupo de instrucciones
      }
    

    este ciclo analizará toda la información del archivo hasta llegar al final del archivo 'prueba' (<ARCH>).

    Una vez abierto el archivo e ingresado en un ciclo para su manipulación se tiene listo el ambiente para explicar algunos términos de eventos :

    $/
    El separador del registro de entrada, por defecto es 'nueva linea', cuando se lee un archivo se puede especificar con este término cómo deberán ser los registros de entrada; si se quiere procesar cada palabra del registro este deberá debe tener el valor de un espacio en blanco, si se quiere procesar el archivo totalmente este término debe llevar el valor de fin de archivo. Este es una ejemplo de como emplear este término :

    Si se tiene el archivo 'prueba' como :

     linea1 : palabra11 palabra12 * palabra13 
     linea2 : palabra21 * palabra22 palabra23
    

    Si no se define el valor de "$/", el valor por defecto que tendria este término es fin de linea "\n" (ver caracteres especiales, lo que significa que cada registro del archivo estará delimitado por un fin del linea, en otras palabras cada linea del archivo representa un registro de entrada; los registros serían :

     registro1 : "palabra11 palabra12 * palabra13"
     registro2 : "palabra21 * palabra22 palabra23"
    

    Ahora bien si antes de iniciar el ciclo de manupilación del archivo (while ..) se definiera el valor de "$/" con el caracter '*' ( $/ = '*'; ) cada registro de entrada estará delimitado por los caracteres '*' presentes en el archivo, para el caso del archivo prueba los registros de entrada serían :

     registro1 :  "palabra11 palabra12 *"
     registro2 :  " palabra13
                   palabra21 *"
     registro3 :  " palabra22 palabra23"
    

    Por último si se definiera el valor de "$/" con el caracter espacio en blanco ($/ = ' ';), los registros de entrada serían :

      registro1 : "palabra11 "
      registro2 : "palabra12 "
      registro3 : "* "
      registro4 : "palabra13
                   palabra21 "
      registro5 : "* "
      registro6 : "palabra22 "
      registro7 : "palabra23"
    
    $_
    Este término representa el valor del registro actual en una manipulación de un archivo, en el caso anterior, sería el valor de cada registro en el ciclo (while ..), ejemplo :

    Si se quiere imprimir el archivo prueba una vez abierto el programa sería :

      open (ARCH,'prueba');
      while(<ARCH>) {
        print $_;	        # imprime el valor de cada registro
      }                     # de entrada
    
    $.
    Representa el número actual de registro de entrada que se está procesando, si en el ejemplo anterior se imprimiera también este término, se obtendria una seria de números enteros desde 1 hasta el número total de registros de entrada.
    $\
    El separador del registro de salida, determina el caracter que acompan~ará al registro de entrada cuando se emplea la función print, si en el caso anterior para $/ = '*' y $\ = '@' los registros que se imprimen de la siguiente forma :
     registro1 :  "palabra11 palabra12 *@"
     registro2 :  " palabra13
                   palabra21 *@"
     registro3 :  " palabra22 palabra23@"
    
    $$
    Número del proceso para el programa cuando se ejecuta.
    $0
    Nombre del archivo en donde se encuentra el programa.
    $!
    Descripción del error al ejecutar cualquier orden de un programa (al ejecutar una función), es muy común emplearse con la función die para retornar el error cuando no se puede abrir un archivo, ejemplo :
      open(ARCH,'archvio') || die "$!\n";
    
    $,
    Separador de campo, este término se emplea con la función print para asignar la cadena de caracteres que permiten separar la impresión de una lista de valores, ejemplo :
      $, = '@';
      print ('hola','mundo); # imprime 'hola@mundo'
    
    $"
    Separador de campo para vectores, este término funcione de igual forma que el término anterior pero en la impresión de vectores , como se muestra en el siguiente ejemplo :
      $" = '*';
      @vector = ('hola','mundo); 
      print "@vector";              # imprime 'hola*mundo'
    

    .

    $%
    Representa el número de página actual seleccionada, para elaborar reportes de impresión.
    $=
    representa la longitud de página (lineas a imprimir), por defecto es 60, este término junto con el anterior definen la paginación de un reporte en perl.
    $-
    Número de líneas reales a imprimir, este término define el taman~o de p`agina en líneas que se va a emplear para la impresión.
    $~
    Nombre actual del reporte.
    $^
    Nombre actual del encabezado del reporte.
    $|
    Este término cuando su valor es diferente de cero (0), obliga a imprimir el reporte o salida seleccionada con la función select() .

    Los siguientes términos actuan sobre las expresiones regulares para determinar los patrones de compración :

    $&
    Representa el valor de la ultima cadena de caracteres comparadas exitosamente, mirar el ejemplo de los 2 siguientes términos.
    $` y $'
    Estos dos términos se utilizan conjuntamente para separar cadenas de caracteres comparadas exitosamente. ejemplo :
      $variable = 'holaAWASque tal';
      $variable =~ /AWAS/;         # severifica AWAS en $variable
       print "$`:$&:$'";       # imprime hola:AWAS:que tal
    

    Donde $& representa el patrón de comparación , $` y $' representan las cadenas que acompan~an en sus extremos al patrón de comparación.


    Variables

    Las Variables en perl son espacios reservados para almacenar información de cualquier tipo, en dichos espacios se puede asignar, limpiar o incrementar información, a diferencia de un valor constante ya sea una letra, un número, o cualquier carcacter o cadena de caracteres las variables son valores que estan cambiando durante la ejecución de un programa en perl . En perl no se hace una declaración explícita de las variables, las variables se definen automáticamente cada vez que se emplean en cualquier parte del programa. A diferencia del lenguaje "C", en perl cada vez que se quiere emplear una varible solo basta escribir la instrucción donde se emplea y la variable queda definida con el tipo de valor que se le asigne en la instrucción, ejemplo :

    Si se quisiera emplear un variable denominada 'valor' que se inicialice con el valor de 1, solo basta escribir la siguiente instrucción :

      $valor = 1;
    

    Si se define una variable con un valor numérico y posteriormente se emplea en un en un contexto de tipo carcater, no existe ningún error puesto que perl asume la variable de tipo carcater; En el caso donde se defina la variable de tipo carcater y posteriormente se emplee en un contexto numérico, perl valida si todos los elementos de la variable son numéricos de lo contario emplea el valor de la variable como cero (0), ejemplo :

      $variable  = 'a';
      $variable2 = $variable+1; # el resultado es 1;
      $variable3 = $variable*2; # el resultado es 0;
      print $variable           # imprime 'a';
    

    En el anterior caso se emplea el valor de cero (0) para $variable en la suma y la multiplicación puesto que inicialmente posee un valor no numérico; el valor de $variable se sigue conservando.

    En perl existen tres clases de variables que son :

  • Escalares : las varibales escalares son las que contienen información ya sea de tipo carcater o numérico; se simbolizan con el caracter "$" seguido del nombre de la variable, ejemplo :
      $valor = 'aaaa';
    

    Se le asigna el valor de 'aaaa' a la variable denominada valor.

    .

  • Vector Posición : este tipo de variables son espacios donde se almacena cualquier tipo de infromación en un arreglo lienal, identificado por valores enteros desde 0 en adelante; dichas varibales representan un conjunto ordenado de variables escalares. Para simbilizar una variable vector posición se emplea el caracter @ seguido del nombre del vector, ejemplo :
      @vector = ('aaa','bbb');
    

    En el anterior ejemplo se asigna al vector posición 'vector' los valores de 'aaa', 'bbb', de esta forma se crean dos campos en el vector; para referirse a un campo específico del vector posicón se emplea la simbología de una variable escalar, especificando el valor de la posición del campo, el cual es un entero a partir de cero (0) en adelante; así en el caso anterior para identificar cada uno de los campos sería :

      $vector[0] # identifica al primer valor ingresado, 
    		    # en el caso anterior representa a 'aaa'
      $vector[1] # representa el valor del segundo campo
    		    # ingresado, en el ejemplo anterior 'bbb'
    

    En el siguiente ejemplo se puede observar la manipulación de todos los valores de un vector posición, donde el símbolo "$#" representa la última posición o el número de campos del vector posición contando a partir de cero (0) :

      foreach $número (0..$#vector) {
        $vector[$número] .= 'xxxx';
      }
    

    Para el anterior ejemplo se emplea la rutina foreach, la cual realiza un cliclo desde 0 hasta la última posición del vector posición 'vector', alterando cada elemento del vector (a cada elemento de le adiciona la cadena 'xxxx'), cuya posición se guarda en la variable escalar $número, la cual toma el valor de cada número especificado en el rango. para repesentar todos los valores del vactor se emplearia la simbología @vector.

  • Vector Asociado : esta clase de variables equivale a un vector posición, pero direccionado por medio de claves, a diferencia del vector posición esta clase de variables manejan los elementos almacenados por medio de claves, en este tipo de vectores al crear un nuevo campo se debe tener encuenta dos componentes principales el valor del campo y el valor de la clave o llave, por ejemplo para definir los 2 primeros campos de un vector asociado se hace de la siguiente forma :
      %vector = ('clave1','valor1','clave2','valor2');
    

    por lo tanto para identificar un elemento específico de un vector asociado se emplea la simboligía de una variable escalar seguida del nombre de la clave del elemento. Para el caso anterior si se quisiera representar el primer elemento sería :

      $vector{'clave1'} # cuyo valor sería 'valor1'
    

    Nótese que para simbolizar un elemento de un vector posición se emplean los corchetes
    ([ ] para especificar la posición) y en el caso de un vector asociado se emplea las llaves
    ({ } para espeificar la clave del elemento).


  • Expresiones Regulares

    Las expresiones regulares en perl permiten evaluar o comparar la existencia de un patrón de comparación en una cadena o un valor determinado; si se tiene un archivo de muchas lineas y se quiere imprimir las lineas que al comienzo tengan el caracter "*", o se quiere reemplazar todas las palabras SERVIDOR por el valor de una variable, se debe emplear las expresiones regulares. Exiten 3 clases de expresiones regulares que se describen a continuación :

  • Comparación : La comparación permite evaluar si un patrón se encuantra en una cadena de caracteres, esta forma de expresión regular permite determinar de una manera lógica la existencia del patrón dando como resultado una salida verdadera o falsa. Su sintaxis es la siguiente :
    	valor a comparar =~ /patrón de comparción/;
    

    Normalmente la comparción es muy útil en la formulación de una condición, es por esto que una comparción hace parte de una condición en cualquier estructura lógica. Es el caso cuando se quiere imprimir el valor de un variable siempre y cuando dicha variable contenga la palabra "verdad" :

          if { $variable =~ /verdad/) {  # evalua la comparación
            print $variable;	     # imprime la variable
          }				     # fin de bloque
    

    En la comparación se emplean las siguientes opciones :

  • i (/PATRON/i) : permite realizar una compración sin importar que el patrón de comparción tenga mayúsculas o minúsculas, ejemplo:
        $variable = 'HoLa';
        if ( $variable =~ /hola/i) { 
    	.....                    # instrucciones
        }
    

    en el anterior caso la evaluación retornará verdadero, si se hiciera sin la opación i la evaluación retornará falso.

  • Sustitución : Esta herramienta permite cambiar patrones de comparación con nuevos caracteres, la sintaxis es la siguiente :
      valor a sustituir =~ s/patrón de comparción/sustitución/;
    

    Un ejemplo de comparción puede mostrarse, cuando se quiere sustituir un caracter en el valor de una variable cualquiera, como en el siguiente caso:

         $variable =~ s/HOLA/saludo/; # sustituye HOLA x saludo
    

    En la sustitución se emplean las siguientes opciones :

  • i (s/PATRON/SUSTITUCION/i) : funciona de igual manera que en el caso de un compración, ignora las mayúsculas en el reemplazo, ejemplo :
      $variable = 'HOla';
      $variable =~ s/hola/saludo/i; 
    

    El valor de $variable será "saludo".

  • g (s/PATRON/SUSTITUCION/g) : esta opción permite reemplazar todas las concurrencias del patrón de sustitución, si no se emplea esta opción, la sustitución se realizará sólo con la primera ocurrencia del patrón de sustitución, como en el siguiente ejemplo :
       $variable = 'algo para hacer algo';
       $variable =~ s/algo/tres/;          # reemplazo normal
       $variable =~ s/algo/tres/g;         # reemplazo global
    

    Para el caso del reemplazo normal el valor de $variable será "tres para hacer algo, para el reemplazo global será "tres para hecer tres".

  • e (s/PATRON/SUSTITUCION/e) : esta opción permite evaluar en la sustitución (SUSTITUCION), valores como funciones, opereaciones las cuales generan un resultado que será el que se reemplazará en la sustitución, ejemplo :
       $variable = 'ae10ou';
       $variable =~ s/\d+/$&*2/;  # reemplazo normal
       $variable =~ s/\d+/$&*2/e  # reemplazo evaluado
    

    Para el caso anterior el valor de $variable para el reemplazo normal será "ae10*2"; para el reemplazo evaluado toma los digitos encontrados y los multiplica por 2, el valor de $variable será "ae20ou". En este ejemplo se emplearon 2 expresiones \d+ y $& son términos especiales en perl que se emplean en las expresiones regulares, el primer término indica los dígitos que se encuentren en la cadena de caracteres y el segundo término representa el valor del dígito encontrado.

  • Translación : Muchas veces se confunde esta herramienta con la anterior, puesto que permiten sustituir caracteres pero con la diferencia que esta herramienta compara el patrón caracter a caracter y no como una cadena completa, esto se lo puede ver de la siguiente forma :

    si se quiere reemplazar todas las letras de una cadena de caracteres a letras mayúsculas es muy útil emplear la herramienta de translación de la siguiente forma :

        $variable =~ tr/a-z/A-Z/; # reemplaza letra a letra
    

    si se quiere reemplazar los caracteres ho por li, el caracter h se reeplaza por el caracter l y el caracter o se reemplaza por el caracter i, si la cadena de comparación es mas larga que los caracteres de sustitución (si en el anterior ejemplo se quisiera transladar los caracteres host por los caracteres li), el reemplazo de los últimos caracter (st) se realiza con el último caracter de la sustitución (i); si por el contrario la cadena a reemplazar fuera ho por la cadena lis, la translación ignora el último caracter de la cadena lis (ignora el caracter s). Para visualizar el anterior ejemplo y la diferencia con la herramienta de sustitución de una manera más práctica, se mostrará las dos herramientas empleadas en una variable específica :

      $variable = 'prueba';
      $variable =~ tr/pr/PR/;  # translación
      $variable =~ s/pr/PR/;   # sustitución
    

    en los dos casos el valor final de $variable es "PRueba", para este caso donde las dos cadenas involucradas en el reemplazo tienen igual longitud la salida de las dos herramientas es la misma.

      $variable = 'prueba';
      $variable =~ tr/prue/PR/; # translación
      $variable =~ s/prue/PR/;  # sustitución
    

    El valor de $variable después de la transalción es "PRRRba" y después de la sustitución el valor de $variable es "PRba"; en este caso la translación reemplazo con el valor del último caracter (R) los caracteres ue, los cuales exceden de longitud a la cadena PR; para el caso de la sustitución no importa la longitud de las cadenas a reemplazar y simplemente reemplaza las dos cadenas por lo especificado en la sustitución.

      $variable = 'prueba';
      $variable =~ tr/pr/PRUEB/;  # transalación
      $variable =~ s/pr/PRUEB/;   # sustitución 
    

    El valor de $variable en la translación es "PRueba", y en la sustitución es "PRUEBueba"; para este caso la transalción ignora los caracteres UEB los cuales exceden en longitud al los caracteres a transaladar pr y simplemente translada los caracteres PR; para la sustitución como en el caso anterior es indiferente la longitud de las cadenas a sustituir.

    Conclusión la sustitución hace la comparación entre cadenas de caracteres sin importar la longitud de las cadenas, la transalción hace la comparción caracter por caracter y es muy importante la longitud de las de las cadenas de caracteres a comparar (ver ejemplos anteriores, para más claridad con la longitud de cadenas).

  • Caracteres Especiales : En perl se emplean caracteres especiales para denotar eventos, como fin de linea, comienzo de linea, un tabulador, una posición etc. A continuación se presentan los dichos caracteres :
    1. ^ : comienzo de linea, este caracter se emplea para denotar el comienzo en una cadena o registro de caracteres, ejemplo :

      Se quiere imprimir $variable si en su parte inicial se encuentra la cadena 'HOLA', las instrucciones en perl serían :

        if ($variable =~ /^HOLA/) {
           print "$variable\n";   # imprime el valor de $variable 
        }                         # y fin de linea
      
    2. $ : final de linea, representa la aparte final de una cadena o registro de caracteres, ejemplo :

      Se quiere imprimir $variable si en su parte final contiene la cadena de caracteres 'FIN', las intrucciones en perl serían :

        if ($variable =~ /FIN$/) {
          print "$variable\n";   # imprime el valor de $variable 
        }                        # y fin de linea
      
    3. ( ) : los parentesis se emplean para encerrar patrones de comparación específicos, con el fin de aplicarles un operador de repetición o un operador de comparacio'n, ejemplo :

      Si se desea marcar la cadena de 'HOLA' como un patrón espcífico de comparacio'n, ser`ia :

        if ($variable =~=~ /(HOLA)xxx/) { ..
      
    4. [ ] : los corchetes se emplea para determinar un conjunto de caracteres que pueden estar presentes en una cadena de caracteres, ejemplo :

      Si se desea sustituir todas la letras 'a' o las letras 'b' en $variable por la cadena 'XX', se deben realizar las siguientes instrucciones :

        $variable = 'acb11a22c';
        $variable =~ s/[ab]/XX/g;
      

      Nótese que si no se usara la opción 'g' en la sustitución sólamente se reeplazaría la primera 'a' en $variable. El resultado final de la sustitución sería "XXcXX11XX22XX", de esta forma los caracteres 'a' y 'b' se reemplazaron por la cadena 'XX'.

      Los corchetes junto con el caracter "^", se emplean para la negación de la existencia de un caracter o un grupo de caracteres en especial, ejemplo :

      En el caso anterior, se quiere reemplazar todos los caracteres que sean diferentes de 'a' o de 'b' por el caracter 'x'; se haría de la siguiente forma:

        $variable = 'acb11a22c';
        $variable =~ s/[^ab]/x/g;
      

      Nuevamente se emplea la opción 'g' para reemplazar todas las ocurrencias, el valor final de $variable ser`ia "axbxxaxxx", de esta forma se reemplazaría todos los caracteres diferentes a 'a' o 'b' por el caracter 'x'.

    5. - : este caracter se emplea para denotar un rango de caracteres o números, ejemplo :

      Se quiere transladar todas las letras minúsculas de $variable a letras mayúsculas, la instrucción sería :

        $variable =~ tr/[a-z]/[A-Z]/;
      

      Si se quisiera simbolizar los número del 0 al nueve más la letras mayúsculas más las letras minúsculas se emplea el caarcter '_', de la siguiente forma :

        $variable = '3abc*XYZ';
        $variable =~ s/[0-9_a-z_A-Z]/x/g; # reemplazo global
      

      El resultado sería "xxxx*xxx".

    6. { } : la llaves representan en una expresión regular la longitud en caracteres de una cadena, ejemplo :

      Si se quiere comparar en $variable un acadena de 40 caracteres 'x' se debe realizar así:

         if $variable =~ /x{40}/ { ...
      

      O en fin una cadena de 40 caracteres no importa los caracteres que tenga sería :

         if $variable =~ /.{40}/ { ...
      

      Donde el carcater '.' representa a cualquier caracter.

    7. \d : representa la exitencia de un dígito [0-9].
    8. \w : un caracter entre [0-9_a-z_A-Z]
    9. \b : un espacio en blanco
    10. \t : un tabulador
    11. \r : un retorno
    12. \n : fin de linea, nueva linea
    13. \s : un espacio o un tabulador o un fin de linea (un separador de palabras o cadenas de caracteres)
    14. \D : caracter diferente a un dígito [^0-9]
    15. \W : diferente a un caracter de [0-9_a-z_A-Z]
    16. \B : diferente a un espacio en blanco [^ ]
    17. \S : diferente a un espacio o tabulador o fin de linea
    18. \ : este caracter permite validar un caracter especial en perl como un caracter normal, ejemplo :

      Para reemplazar el caracter ^ en $variable se debe invalidar como caracter especial ya que este caracter representa el comienzo de una línea, esta sería la forma de hacerlo :

       $variable =~ s/\^a/a/g; # sustituye todas las cadenas de 
      			 # caracteres '^a' ( y no lo que 
      			 # comience por 'a' ) por el caracter 'a'
      

      Si en vez de reeplazar la cadena '^a' se quisiera reemplazar la cadena '\d ', cuyo valor especial es un dígito de 0 a 9, se debe eliminar el valor de '\' como carcater especial de la siguiente forma :

        $variable =~ s/\\d/d/g; # sustituye los caracteres '\d' 
      			  # (mas no los dígitos de 0 a 9)
      			  # por el caracter 'd'
      
    19. Operadores de Repetición : estos términos permiten manejar una cadena de caracteres un número de veces en una expresión regular; dichos caracteres son :
      1. * : permite representar un patrón específico de comparación de 0 o m`as veces, ejemplo :

        Se quiere sustituir todos los espacios en blanco presentes en al comienzo de $variable; si esta sustitución se la hiciera sólamente con la opción 'g', se reemplazaría todos los espacios presentes en $variable, para ello fuera necesario escribir todos los espacios existentes al comienzo de $variable, pero en la mayoría de los casos no se sabe con seguridad cuantos espacios o caracteres existen al comienzo de una variable, para ello se emplea este término de la siguiente forma :

         $variable = '     Hola   ';
         $variable =~ s/^ *//; # reemplaza los espacios en blanco
        		       # al comienzo de $variable
                               # el resultado sería 'Hola   '
        

        Ahora bien, si fuera más de un caracter, es necesario marcar los caracteres como un patrón de comparación específico (encerrarlos en ( )), si se quisiera reemplazar todas las cadenas 'bi' presentes al final de $variable por el caracter '*', se haría de la siguiente forma :

        $variable = 'abibiXbbibibibi';
        $variable =~ s/(bi)*$/\*/;  # '\*' para tomar '*' como un 
        			    # carcater normal, el resultado será
        			    # 'abibiXb****'
        
      2. + : este caracter funciona de igual manera que el carcater "* " pero con la diferencia que representa un caracter o un patrón específico de comparación 1 más veces ( en el caso anterior 0 o m`as veces )
      3. . : representa a cualquier caracter presente en una cadena de caracteres, este término se emplea junto con el caracter '*' para denotar cualquier cadena de caracteres, ejemplo :

        Se quiere evaluar en $variable si existe al comienzo la cadena 'ab' seguida de cualquier número de caracteres y porteriormente la cadena HOLA, sería :

          if (/^ab.*HOLA/) { ...
        
          'abxgsgshHOLAskks'   -> verdadero
          'abgs&52652HOLA'     -> verdadero
          'abHOLA'             -> verdadero 
        

        En el caso anterior la cadena 'abHOLA' retornaría un valor falso si la evaluación se hiciera con el carcater '+' ( if /^ab.+HOLA/ { ..) el cual representa al lado del caracter '.' la existencia de por lo menos un caracter entre la cadena 'ab' y 'HOLA'.

      4. ? : este carcater representa una cadena opcional en un expresión, si la cadena tienen mas de dos caracteres es necesario representarla como un patrón específico de comparación (encerrarla en ( )), ejemplo :

        Si se quiere sustituir todas las cadenas 'SALON' incluyendo su plural 'SALONES' por el caracter 'x' se realiza de la siguiente forma :

          $variable =~ s/SALON(ES)?/x/;
        
          'SALONy'   -> resultado 'xy'
          'SALONSy'  -> resultado 'xSy'
          'SALONESy' -> resultado 'xy'
        
    20. Operadores de Comparación : Estos operadores se emplean para confrontar patrones específicos de comparación, a continuación de describen algunos de ellos :

      $1..9 : estos términos representan los patrones espcíficos de comparación en una expresión regular, ejemplo :

      Se quiere reemplazar en $variable la cadena de caracteres 'gopher' o 'news' por la misma cadena de caracteres original adicionada antes de ella la cadena 'El Servicio ', esta sería la forma de realizarlo :

        $variable =~ s/(gopher|news)/El Servicio $1/g;
      

      En el caso anterior el patrón específico de comparacíon esta denotado por la cadena 'gopher' o la cadena 'news', en el patrón de sustitución se encuentra la cadena 'El Servicio ' seguida del término '$1' que representa al primer y en este caso único patrón especíifico de comparación ya sea 'gopher' o 'news', esto significa que cada vez que se encuentra la cadena 'gopher' o 'news' se guarda temporalmente en el término $1 para posteriormente utilizarlo en el patrón de comparación. de esta forma se presentarían los resultados :

      'xxx gopher xxx' -> resultaría 'xxx El Servicio gopher xxx'
      'xx news'        -> resultaría 'xx El Servicio news'
      'news, gopher'   -> resultaría 'El Servico news, El Servico gopher'
      

      Ahora si existieran 2 o más patrones espcíficos de comparación (2 o más cadenas encerradas en ( ), ejemplo /(cadena1)(cadena2)/), cada cadena conforma un patrón específico de comparación y se guarda temporalmente en los términos $1, $2, $3 .. y así susesivamente. Perl soporta 9 patrones específicos de comparación lo que significa que se puede emplear los términos desde $1 hasta $9.

      \1..9 : estos operadores a diferencia de los operadores anteriores se emplean para representar los patrones específicos de compración pero en el mismo lugar del patrón de comparación y no en el patrón de sustitución como en el caso de anterior, ejemplo :

      Si se quisiera evaluar una cadena de caracteres [0-9_a-z_A-Z] presente al comienzo y al final de $variable se haría de la siguiente forma :

        if (/^(\w)+.*\1$/) { ...
      
      donde : ^     comienzo de la cadena
      
              (\w)+ cadena de caracteres [0-9_a-z_A-Z] 
      	      presente por lo menos un vez, ademas
      	      primer patrón especíifico de comparación
      
              .*    cualquier cadena de caracteres
      
      	\1    término que representa al primer
      	      patrón de compación osea a (\w)+
      
      	$     final de la cadena
      

      Para los siguientes valores de $variables lo sresultados serían :

        '1hola xxx 1hola'   verdadero
        '1hola xxx'         falso
        '&* xxxx &*'     falso
      

      si existieran mas de 1 patrón de comparación se emplearían los términos \2 , \3 .. y asi susesivamente.

      Para combinar las dos clases de términos vistas anteriormente se puede realizará el siguiente ejercicio :

      identificar las dos primeras palabras iniciales presentes tanto al inicio como al final de la cadena y reemplazar toda la cadena por las dos palabras pero en en orden invertido, primero la segunda palabra encontrada y luego la primera ; de esta forma :

        $variable =~ s/^(\w)+\s(\w)+.*\1\s\2$/$2 $1/;
      
      donde : ^     comienzo de la cadena
      
              (\w)+ cadena de caracteres [0-9_a-z_A-Z] 
      	      presente por lo menos un vez, ademas
      	      primero y segundo patrón de específico
                    comparación
      
      	\s    representa un espacio en blanco, un
      	      tabulador (un separador de cadenas de
      	      caracteres o palabras)
      	
              .*    cualquier cadena de caracteres 
      
              \1    término que representa al primer patrón
      	      especíifico de comparación
      
              \2    término que representa al segndo patrón 
      	      específico de compración
      
      	$     final de la cadena
      

      Los anteriores términos representan el patrón de comparación, ahora se muestra los términos del patr`on de sustitución :

              $1    representa al primer patrón específico
      	      de comparación (igual que '\1' pero ahora
      	      en el petrón de sustitución)
      
      	$2    representa al segundo patrón específico
      	      de comparación (igual que '\2' pero ahora
      	      en el petrón de sustitución)
      

      A continuación se presenta la sustitución resultante para algunas cadenas de caracteres :

         'mundo   hola auuas mundo hola'   resulta  'hola mundo'
         'mundo xxxxx mundo'               no reemplaza nada
         'esto sale y %%xx** esto   sale'  resulta  'sale esto'
      

  • Funciones

    Las funciones son instrucciones especiales que permiten procesar información a partir de unos parámetros iniciales y dan como resultado una información específica.

    Normalmente las funciones actuan sobre un grupo de parámetros, los cuales se encierrean en paréntesis y se los separa por comas ","; cuando se escribe una función sin parámetro generalmente actua sobre el valor actual del registro de entrada denotado por el término $_; si una función actua por defecto sobre $_ basta escribir el nombre de la función y automáticamente se actualiza $_ con el valor retornado así :

      $_ = 'ab';
      chop;      # quita el último caracter de $_
      # el nuevo valor de $_ será 'a'
    

    Estos serán los términos empleados para describir las funciones :

    #          : un número, no se emplea una variable
    valor      : un número cualquiera o una variable con valor numérico
    dir        : el nombre de un directorio
    lista      : una lista de valores o variable también puede ser un vector
                tal como $a,'ab,$b o @vector; cada valor separado por coma ",".
    archivo    : una cadena de caracteres que describen el nombre especial de un 
    	     archivo abierto por la función open
    $variable  : una variable, no es un valor constante
    expresión : hace referencia a cualquier tipo de validación, en la descripción
                de cada función se especifica la expresión.
    @vector	   : el nombre de un vector
    %vector    : el nombre de un vector asociado
    ....	   : un grupo de instrucciones
    
    

    Indice de Funciones

      abs valor
      atan2 (valor1, valor2)
      chdir (dir)
      chmod #, lista
      chop lista
      chown valor1, valor2, lista
      chr valor
      close (archivo)
      closedir (dir)
      cos val
      defined (expresión)
      delete $vector{clave}
      die lista
      each %vector
      eof (archivo)
      exec lista
      exists (expresión)
      exit (expresión)
      exp valor
      getc archivo
      getpgrp PID
      getlogin
      getppid
      gmtime
      grep (expresión, lista)
      hex valor
      index (valor, cadena , posición)
      int valor
      join (valor, lista)
      keys %vector
      kill #, lista
      last palabra
      lc valor
      lcfirst valor
      length valor
      link valor1, valor2
      local (lista)
      localtime
      log valor
      mkdir (dir, #)
      next palabra
      ord valor
      pop @vector
      open (archivo, valor)
      opendir (archivo, dir)
      print lista  
      printf (archivo, formato, lista
      push (@vector, lista)
      rand valor
      redo (valor)
      rename (nombre1, nombre2)
      reset expresión
      return lista
      reverse lista
      rindex (valor, cadena, posición)
      rmdir dir
      scalar vector
      select (archivo)
      shift @vector
      sin valor
      sleep valor
      sort subrutina expresión
      splice (@vector, elemento, numero_elemento)
      split (/patrón/, expresión, número)
      sprintf (formato, lista)
      sqrt valor
      substr (valor, longitud, posición)
      system lista
      uc valor
      ucfirst valor
      unlink lista
      undef valor
      unshift (@vector, lista)
      values %vector
      write archivo
    

    A continuación de presentan la descripción de cada una de las funciones :

    abs valor
    Retorna el valor absoluto de valor.
    atan2 valor1/valor2
    esta función permite retornar el valor de la arcotangente de (valor1/ valor2) en el rango de -PI a PI.
    chdir (dir)
    cambia del directorio actual de trabajo al directorio especificado por dir.
    chmod #, (lista)
    cambia los permisos a la lista de los archivos, en esta función se emplea numeros que son utilizados por el comando chmod del sistema operativo, si se quisiera otorgarle los permisos de ejecución a 'archivo' sería :
     chmod 0755 archivo;
    
    chop (lista)
    chop $variable
    quita el ultimo carcater de una variable y retorna el carcter suprimido. Si se utiliza lista actúa sobre todos los elementos de la lista. Actúa por defecto sobre $_.
    chown valor1, valor2 lista
    Cambia de propietario a una lista de archivos o directorios, donde valor1 es el número de usuario y valor2 es el número de grupo.
    chr valor
    restorna el carcater representado por valor en codigo ASCII.
    close (archivo)
    Cierra las entradas o archivos especiles (archivo) abiertos por la función open.
    closedir (dir)
    Cierra el directorio (dir) abierto por la función opendir
    cos (valor)
    retorna el coseno de x expresado en radianes.
    defined (expresión)
    retorna un valor booleano; se emplea para determinar si una variable se encuentra definida explícitamente, que en algún lugar del programa se defina con un valor ya se nulo o no nulo, también se valida esta función en una instrucción como en el siguiente caso :
      print "funciona\n" if defined ($variable = pop(@vector));
    

    En el anterior ejemplo la función definied se emplea sobre una asiganción de una variable, si existe @vector y por lo menos un elemento en él, la funcíon pop retornará un valor el cual se le asignará a $variable, la función definied retornará un valor verdadero (ya que se $variable adquiere un valor) y se imprimirá "funciona" con un final de linea.

    delete $vector{'clave'}
    borra el elemento especificado del vector asociado.
    die lista
    imprime el valor de lista para la salida estandar de errores, esta función se utiliza para imprimir los errores que se presentan en la ejecución de una expresión, ejemplo :
      open(archivo, valor) || die "no puede abrir archivo: $!\n"
    
    each %vector
    esta función retorna 2 valores consistentes de un vector asociado, como en el siguiente ejemplo :
      while (($clave, $valor) = each %ENV) {
        print "$clave = $valor\n";
      }
    

    En el anterior ejemplo se emplea un ciclo (while) el cual permite evaluar todos los valores del ambiente (ENV) por medio de la función each, la cual retorna cada ciclo 2 valores cada uno de estos se asigna a $clave y $valor respectivamente y posteriormente se imprime estos dos valores retornados hasta finalizar el ciclo (finaliza el ciclo cuando se ha asignado todos los valores del ambiente).

    eof (archivo)
    indica la finalización de la lectura del archivo.
    exec lista
    ejecuta una lista de comandos del sistema operativo y sale inmediatamente del programa que se esta ejecutando, si se quiere retornar una vez ejecutado el comando del systema operativo de debe emplear la función system, ejemplo :
      exec 'ls -l'; # ejecuta 'ls -l' y sale automáticamente
    
    exists (expresión)
    esta función permite conocer si una variable existe. a diferencia de la función defined se emplea en vectores asociados para determinar si por lo menos existe el campo llave en el vector, si se empleara la función defined, además de existir el campo llave debe tener un valor ya sea nulo o no nulo :

    Cuando se evalua un variable if $variable, retorna un valor verdadero si la variable tiene un valor diferente de nulo, por lo tanto se puede concluir : toda variable que retorne un valor verdadero esta definida, y toda variable que se encuentre definida existe, pero no toda variable que exista se encuentra definida y no toda variable definida retorna un valor verdadero.

    exit (expresión)
    evalua la expresión y sale inmediatamente de la ejecución del programa, la expresión pude ser cualquier función o una asignación o una ejecución.
    exp valor
    retorna el número (e) elevado a la potencia representada por valor, ejemplo :
      $variable = exp 1;
    

    Retornará el valor de 2.71828182845905, actua por defecto sobre $_ .

    getc archivo
    esta función retorna el valor del siguiente caracter que ingresará en el registro de entrada, por ejemplo :

    Se quiere leer el archivo 'texto.txt' y manejarlo en un ciclo linea por linea e imprimir si el primer caracter de la siguiente linea es 'S'

      open(ARCH,'texto.txt') || die "$!\n";
      while (<ARCH>) {
        $variable = getc ARCH;
        print if $variable eq 'S'
      }
    
    getpgrp PID
    retorna el número del grupo de procesos actuales, si se emplea con la opción cero (0) retorna el número del proceso actual.
    getlogin
    retorna el login actual en que se esta trabajando.
    getppid
    retorna el número del proceso padre, si se estuviera ejecutando un programa en perl desde la linea de comandos, el proceso padre sería el proceso del shell.
    gmtime
    permite obtener el formato tiempo con respecto al meridiano cero (0) en 8 elementos de la siguiente forma (para obterner el formato de tiempo local se emplea la función localtime):
      ($sec,$min,$hora,$mdia,$mes,$an~o,$sdia,$adia) = gmtime;
    
    donde :
      $sec  = segundos (0-59)
      $min  = minutos (0-59)
      $hora = hora (0-23)
      $mdia = día del mes (1-31)
      $mes  = mes (1-12)
      $an~o = an~o (dos digitos)
      $sdia = día de la semana (0-6)
      $adia = día del an~o (0-365)
    
    grep (expresión, lista)
    evalua expresión en la lista de valores y retorna los valores que fueron evaluados positivamente. ejemplo :
      @vector1 = grep (/^#/, @vector);
    

    en este caso evalua en todos los elementos de vector, si existen elementos que inicien con el caracter '#' se almacenan en el vector vector1.

    hex valor
    retorna el valor decimal de valor que se interpreta como un valor hexadecimal.
    index (valor, cadena , posición)
    index (valor, cadena)
    retorna el valor de la posición de la primera ocurrencia de 'cadena' en 'valor', a partir de la posición especificada por 'posición' (si se quiere el valor de la última ocurrencia se utiliza la función rindex ), si no se especifica 'posición' empieza desde la posición cero (0) que representa la primera posición en un cadena de caracteres; si 'cadena' no se encuentra en 'valor' el valor retornado es -1. Ejemplo :
      $variable1 = index ($variable, 'h', 3);
    

    Para los siguientes valores de $variable los valores de $variable serían :

      'xxhxx' resultado -1 
      'xxxh' resultado 3
      'xxxx' resultado -1
    

    En el primer caso se encuentra 'h' en la cadena pero no apartir de la posición tres (3), se encuentra en la posición 2 (se empieza a contar a partir de cero (0)), en el segundo caso se encuentra en la posición 3 y en el último caso no se encuentra.

    int valor
    retorna la parte entera de valor, ejemplo :
      $variable = int 3.1416; # el valor de $variable será 3
    
    join (valor, lista)
    retorna los elementos de lista separados por la cadena valor, ejemplo :
      $variable  = 'mundo';
      $variable1 = join (' : ', 'hola',$variable);
    

    El valor de $variable1 será "hola : mundo".

    keys %vector
    retorna las llaves del vector asociado vector, en orden descendente de taman~o, ejemplo :
      $vector{'hola'} = 'saludo';
      $vector{'mundo} = 'saludo';
      $variable = join (' : ', keys %vector);
    

    El valor de $variable será "mundo : hola".

    kill #, lista
    esta función permite enviar una sen~al para concluir un proceso, el número '#' indica la severidad del la conclusión desde 1 hasta 9 donde 1 indica reiniciar el proceso y el 9 indica la terminación definitiva del proceso, ejemplo :
      kill 9, 1578, 678 # termina los procesos 1578 y 678
    
    last palabra
    esta función indica la salida para un ciclo determinado por palabra, si no se especifica palabra ocurrirá la salida del ciclo actual, ejemplo:
      linea: while (<STDIN>) { 
               last linea  if /^$/; 
               print; 
             }
    

    En este ejemplo si se presenta un línea vacía entonces se sale inmediatamente del ciclo especificado por la palabra 'linea', mas no del programa.

    lc valor
    retorna una cadena de caracteres especificada por valor en letras minúsculas, ejemplo :
       lc 'HHHxxxOOO' # retorna 'hhhxxxooo'
    
    lcfirst valor
    esta función retorna el primer la cadena de caracteres valor con el primer caracter en minúsculas, ejemplo :
      $variable = 'HOLA COMO';
      $variable = lcfirst $variable;
    

    El valor de $variable será 'hOLA COMO'.

    length valor
    retorna la longitud en caracteres de valor.
    link valor1, valor2
    crea un copia del archivo valor1 y la denomina valor2.
    local (lista)
    declara las variables especificadas en lista como variables locales, esta función se emplea para trabajar localmente en subrutinas.
    localtime
    permite obtener el formato de tiempo local en 8 elementos de la siguiente forma (para obterner el formato de tiempo con respecto al mediriano cero (0) se emplea la función gmtime):
      ($sec,$min,$hora,$mdia,$mes,$an~o,$sdia,$adia) = localtime;
    
    donde :
      $sec  = segundos (0-59)
      $min  = minutos (0-59)
      $hora = hora (0-23)
      $mdia = día del mes (1-31)
      $mes  = mes (1-12)
      $an~o = an~o (dos digitos)
      $sdia = día de la semana (0-6)
      $adia = día del an~o (0-365)
    
    log valor
    retorna el logaritmo (en base {e}) de valor, ejemplo :
      $variable = log 2.71828182845905; # el valor de $variable será 1
    
    mkdir (dir, #)
    crea el directorio dir con los permisos especificados con el número #, ejemplo :
      mkdir (dir, 0755); # crea el directorio dir, con permiso de escritura
    		     # para el usuario y de lectura para el grupo y otros
    
    next palabra
    ignora la actual iteración en un ciclo y continua con la siguiente iteración del ciclo especificado por palabra, si no se define palabra la siguiente iteración se realiza en el ciclo actual, ejemplo :
    linea :while (<STDIN>) { 
             next linea if /^ /;     
             print; 
           } 
    

    En el anterior ejemplo no imprime la linea que comience con un espacio en blanco.

    ord valor
    retorna el valor ascii del primer caracter de valor, si se omite valor actua sobre $_ .
    pop @vector
    borra y retorna el último valor vector.
    open (archivo, valor)
    esta una de las funciones principales de perl puesto que permite la manipualación de archivos, entradas y salidas por medio de archivos especiales .

    Esta función tiene como parámetros, una cadena que identifica el nombre del archivo especial, este nombre permitirá identificar en el resto del programa la información proveniente del segundo parámetro el cual puede ser un archivo, un comando de entrada, una salida o un comando de salida. a continuación se presenta la descripción del segundo parámetro de la función open :

    1. Un Archivo de Entrada : cuando el segundo parámetro contiene el valor de un archivo, inmediatamente el archivo se abre en modo de lectura para suministrar toda la información que contiene y sea manipulada en un ciclo como un archivo especial con el nombre del primer parámetro de la función open, la información se manipula por medio del registro de entrada ($_ ) en forma de paquetes de información cuyo taman~o y logitud se define con el separador del archivo de entrada ($/), cada ciclo representa un nuevo valor de registro, una nueva actualización del término $_, como se muestra a continuación :
        open (ARCH, '/ect/passwd') || die "$!;
        while (<ARCH>) {
          print;
        }
      

      En el anterior ejemplo se abre el archivo '/etc/passwd' y se lo asigna al archivo especial ARCH, el cual por medio del ciclo while suministra la información para que esta se imprima por medio de la función print. La función print actua por defecto sobre $_, por lo tanto print; equivale a print $_; de esta forma se explica como ingresa la información al archivo especial ARCH por medio de registros los cuales se asignan al término $_ en cada ciclo.

    2. Un Comando de Entrada : cuando el segundo parámetro equivale a un comando de entrada en el sistema operativo, entendiendose como comando de entrada aquel comando que genera un salida de información sin error alguno, como por ejemplo el comando 'finger', el comando 'who', o una serie de comandos 'finger | grep usuario', los cuales generan una salida; se trata la información de la misma forma como se manipula un archivo de entrada descrito anteriormente, en principio la información proveniente de un comando equivale a la información proveniente de un archivo, ejemplo :
        open (ARCH,'finger|') || die "$!\n";
        while (<ARCH>) {
          print;
        }
      
      Para identificar un comando de entrada, el segundo parámetro de la 
      función open termina con el caracter '|' como se muestra en el ejemplo.
      

      En el anterior ejemplo se imprime la información de la misma forma como se imprimió en el caso anterior.

      Ademas de un comando de entrada se puede manejar la entrada del teclado con la función open; de esta forma cada vez que se quiera emplear un ingreso por pantalla se hará referencia al archivo especial que se le asigne en la función open de la siguiente forma :

        open (TTY,'/dev/tty') || die "$!\n";
        print 'Ingrese un valor :';
        $variable = <TTY>;
      

      En el anterior ejemplo se emplea en el sistema operativo el archivo especial '/dev/tty' el cual representa el manejo de la terminal en que se corre el programa, de esta forma se le asigna a este manejo el nombre de 'TTY' y se lo trata como un archivo especial en el resto del programa, haciendo referencia como <TTY> cada vez que se necesita ingresar información por pantalla.

    3. Un Archivo de Salida : cuando se quiere almacenar cualquier salida de un programa en un archivo específico se emplea un archivo de salida. La función open permite crear el archico y relacionarlo con un archivo especial cuyo nombre se especifica en el primer parámetro de la función; la información cada vez que se imprime con la función print especificando el archivo especial se dirige y se almacena al archivo creado. Cuando se abre un archivo de salida existen dos posibilidades de abrirlo, la primera es crear un nuevo archvio de salida y la segunda es verificando si el archivo existe, si existe le adiciona toda la salida, si no existe simplemente lo crea, ejemplo :
       open (ARCH,'/etc/passwd') || die "$!\n";
       open (SALE,'>archivo_nuevo') ||  die "$!\n";
       open (ACT,'>>archivo_existente') || die "$!\n";
       while (<ARCH>) {
         print SALE;
         s/^ *//;
         print ACT;
       } 
      

      En el anterior ejemplo se muestra claramente la aplicación de las dos formas de abrir un archvivo de salida, para el caso de SALE se emplea el símbolo > que repesenta la primera forma de apertura, crear un nuevo archivo de salida, para ACT se empleó el símbolo >> que representa la segunda forma de abrir un archivo, verifica si ya está creado y le adiciona la información de lo contrario lo crea, en seguida se empleó un ciclo para manipular ARCH que repesenta un archivo de entrada , imprimiendo cada resgistro de entrada ($_) en SALE que representa al archivo 'archivo_nuevo', e imprimiendo en ACT que repesenta el archivo 'archivo_existente', el registro de entrada sin espacios en blanco al comienzo.

    4. Un Comando de Salida : cuando se desea mandar la información a una salida en el sistema operativo, para que se procese, se emplea los comandos de salida, por ejemplo :
        open (ARCH,'/etc/passwd') || die $!\n";
        open (SALE, '|more') || die "$!\n";
        while (<ARCH>) {
          print SALE;
        }
      
      El comando de salida se identifica en la función open cuando el carcater "
      |" se encuentra al comienzo del comando (en el anetrior caso '|more').
      

      En el anterior ejemplo se emplea ARCH, como un archivo de entrada y además se asigna el comando de salida 'more' a un archivo especial SALE; lo que siginifica que por cada impresión hecha por la función print al archivo especial SALE, se enviará la salida al sistema operativo y se ejecutará el comando more para desplegarla pantalla por pantalla.

      Un comando de entrada debe ser capaz de generar información cada vez que se ejecute, un comando se salida debe ser capaz de procesar la información que reciba.

      Normalmente la función open se acompan~a del operador lógico || y la función die para obtener el error si por cualquier razón no se puede ejecutar la función.

    opendir (archivo, dir)
    permite manejar un directorio en un archivo especial similar a manejar archivos con la función open, la información que se maneja por medio del archivo especial especificado por archivo, se la procesa con la función readdir, de la siguiente forma :
      opendir (DIR, '.') || die "$!\n";
      @vector = readdir DIR;
    

    El anterior ejemplo se abre el directorio actual en el archivo especial DIR y se almacena el nombre de los directorios en vector por medio de la función readdir.

    print (archivo expresión)
    imprime expresión en el archivo especial archivo abierto por la función open , si se omite archivo imprime sobre la salida estandar STDOUT (generalmente es la pantalla a menos que se defina STDOUT en alguna parte del programa), si se omite expresión imprime $_, ejemplo :
     print (SALE $variable, $variable2, 'hola');
    # imprime en el archivo especial SALE los valores $variable, $variable2, 'hola'
    
     print $variable, $variable, 'hola';
    # imprime en STDOUT los valores de $variable, $variable, 'hola'; si STDOUT
    # no se define en alguna parte imprime en la pantalla
    
     print;
    # imprime el registro de entrada $_ en STDOUT
    
     print ((1+2)*3, "\n");
    # imprime en STDOUT 9 y un fin de linea
    
     print (chop($variable), $variable);
    # imprime en STDOUT el último caracter de $variable y $variable 
    
    printf (archivo formato, lista)
    esta función imprime lo especificado en lista en el archivo especial especificado por archivo, en la forma especificada por formato. Cuendo se refiere a forma indica la manera como se imprimiran los valores, si son caracteres, decimales etc ademas de especificar su longitud, para mayor claridad refierase a la función sprintf. cuando se omite el archivo especial se imprime en la salida estandar ( STDOUT).
    push (@vector, lista)
    adiciona los elementos de especificados en lista al final del vector especificado por vector.
    rand valor
    retorna un número randómico desde 0 hasta valor, si valor se omite el valor va desde 0 hasta 1.
    redo (valor)
    reinicializa el las iteraciones de un ciclo. ejemplo:
    linea : while(<ARCHIVO>) {
              ....
              for (1..5) {
                ....
                print;
                redo linea if $variable == 1;
              }
            } 
    

    En este caso se reinicia el ciclo a partir de la instrucción while cuando el valor de $variable es 1.

    rename (nombre1 , nombre2)
    cambia de nombre un archivo, el archivo nombre1 lo denomina nombre2.
    reset expresión
    se emplea para inicializar las variables expecificadas en expresión, ejemplo :

    reset 'a-z'; # inicializa las variables que tengan letras minusculas.

    return lista
    esta función retorna el valor especificado en lista dentro de una subrutina, ejemplo :
    sub sumar {
       local ($variable);
       for (1..5) {
         $variable *= 2;
       }
       return $variable;
     } 
    

    En el anterior ejemplo l asubrutina sumart retorna el valor de $variable, cada vez que se ejecuta o se llama la subrutina.

    reverse lista
    retorna la lista de valores lista en orden opuesto, si lista es un vector, retorna los elementos del vector en el orden opuesto. ejemplo :
      print (reverse @vector);
    #  imprime los elementos de vector en orden opuesto.
    
    rindex (valor, cadena, posición)
    retorna el valor de la posición de la última ocurrencia de 'cadena' en 'valor', a partir de la posición especificada por 'posición' (si se quiere obtener el valor de la primera ocurrencia se emplea la función index), si no se especifica 'posición' empieza desde la posición cero (0) que representa la primera posición en un cadena de caracter es; si 'cadena' no se encuentra en 'valor' el valor retornado es -1. Ejemplo :
      $variable1 = rindex ($variable, 'h', 3);
    

    Para los siguientes valores de $variable los valores de $variable serían :

      'xxhxx' resultado -1 
      'xxxxhh' resultado 5
      'xxxx' resultado -1
    

    En el primer caso se encuentra 'h' en la cadena pero no apartir de la posición tres (3), se encuentra en la posición 2 (se empieza a contar a partir de cero (0)), en el segundo caso la última ocurrencia se encuentra en la posición 5 y en el último caso no existe ninguna ocurrencia.

    rmdir dir
    borra el directorio especificado por dir siempre y cuando se encuentra vacio.
    scalar vector
    si vector es un vector asociado, retorna VERDADERO o FALSO en caso de que tenga o no tenga elementos definfidos; de lo contrario si es un vector posición retorna el número de elementos que posea el vector.
    select (archivo)
    permite determinar el archivo especial por defecto para las funciones print y write, además de aplicar los términos como lomgitud de página, número de lineas en un reporte. ejemplo :
      select (ARCH);
      print;
      $^ = 'encabezado de ARCH';
    

    En el anterior caso se selecciona el archivo especial ARCH para imprimir por defecto el registro de entrada $_ por medio de la función print y además define el encabezado para el archivo especial ARCH que representa la parte de un reporte .

    shift @vector
    borra y retorna el primer elemento del vector especificado por vector.
    sin valor
    retorna la función seno de valor expresada en radianes.
    sleep valor
    hace una pausa especificada en segundos por valor.
    sort subrutina, expresión
    ordena los elementos especificados en expresión de acuerdo a subrutina, la subrutina involucra un patrón de comparación ya sea numérico o de tipo carcater, a continuación se muestra la definición de las subrutinas y el uso de esta función :
      @vector = (1, 2, 3, 10, 20); 
      sub numérico {
        $a <=> $b;
      }
      sub caracter {
        $c cmp $d;
      }
      $variable = sort numérico @vector;
      $variable1 = sort caracter @vector; 
    
    el resultado de $variable es '1 2 3 10 20'
    el resultado de $variable1 es '1 10 2 20 3'
    

    Si se omite el párametro de la subrutina el ordenamiento lo hace tipo carcater
    Para ordenar descendente se emplea la función reverse, así :

    sort reverse @vector # ordenamiento tipo caracter descendente 
    
    splice (@vector, elemento, #numero_elemetos, valores)
    Remueve, remplaza o adiciona elementos a un vector;
    ejemplo 1
    splice (@vector, 5, 2, 'hola');

    remplaza en vector 2 elementos a partir del elemento 5 ( reemplaza $vector[5] y $vector[6] ) con el valor de 'hola' ( el elemento $vector[5] tomará el valor de 'hola' y se borrará el elemento $vector[6]).

    Si en lugar de 2 elementos el valor fuera 0 elementos, simplemente se adicionaría el valor de 'hola' ( $vector[5] toma el valor de 'hola' adicionadose como nuevo elmento de vector, $vector[6] tomará el valor de $vector[5] antes de la insercción, $vector[7] tomará el valor de $valor[6] antes de la insercción y asi susesivamente.

    ejemplo 2
    splice (@vector, 5, 2);

    en este caso se borarrían 2 elementos de vector apartir del elemento 5 (se borrarían $vector[5] y $vector[6]).

    ejemplo 3
    splice (@vector, 5);

    en este caso, simplemente se borrarían todos los elementos de vector a partir del elemento 5.

    split (/patrón/, expresión , número)
    esta función toma expresión de tipo caracter y retorna el resultado en un vector. Especificamente divide expresión de acuerdo con el patrón de división (/patrón/); si se especifica número se determina cuantas divisiones se realizarán, este valor es opcional. Ejemplo :
      @vector = split (/x/,$_,3);
    

    supongamos que el registro de entrada ($_) tiene el valor de 'AxBxCxDxFE'.

    El vector 'vector' se creará con 3 campos cada uno con los siguientes valores:

    A, B, C

    Si no se hubiera especificado el valor 3 el vector 'vector' se crearía con los siguientes 5 campos:

    A, B, C, D, FE

    ejemplo 2
    @vector = split (/x/)

    en este caso opera todas las lineas del registro de entrada (este caso se emplea para registros simples como una variable o un valor tipo caracter).

    Si se omitiera el patrón (/patrón/), la division se realiza de acuerdo a espaciadores, ya sean espacios en blancos o tabulaciones.

    El resultado se lo puede asignar a un grupo de variables en lugar de un vector.

    Si se emplea paréntesis en el patrón de división (/(patrón)/) se crea un campo para los valores del patron; en el caso del primer ejemplo, se crearían campos para cada uno de los valores 'x'.

    sprintf (formato, lista)
    esta función retorna los valores especificados en lista en la forma especificado por formato.

    El formato de una salida se refiere a la clase de información retornada, su longitud y en el caso de variables numéricas su presición. Para identificar el formato se especifica con las siguientes letras precedidad del caracter "%" :

      s  : para un valor tipo caracter
      c  : para un solo caracter
      d  : para un valor decimal
      ld : número decimal tipo long
      u  : número no signado
      lu : número decimal no signado tipo long
      x  : número hexadecimal
      lx : número hexadecimal tipo long
      o  : número octagonal
      lo : número octagonal tipo long
      e  : exponecial
      f  : número ajustado, aproximado
      g  : núemro sin decimales
    
    por ejemplo :
     %5.3s imprime de 5 posiciones 3 de ellas una cadena tipo caracter
     %5.3d imprime de 5 posiciones 3 de ellas un número decimal
     %5.3f imprime con un precisión de 5 enteros y tres decimales un nuero real
     %5.3e imprime un número con 1 posición entera expresado en potencias de 10
           (ej 1.23e+01, 1.4e-03), con una precisión de 3 decimales en ocupando
           5 posiciones     
    
    sqrt valor
    retorna el valor de la raiz cuadrada de valor.
    substr (valor, longitud, posición)
    retorna desde valor la cadena de caracteres de de taman~o especificado por longitud iniciando desde el número de caracter especificado por posición (la posición de los caracteres se inician a partir de cero (0)), ejemplo :
    $variable = 'hola a todos' 
    print (substr ($variable,0,4)); # imprime 'hola'
    

    Si se omite posición retorna los caracteres desde el valor especificado por lonogitud hasta el final de la cadena.

    system lista
    esta función se emplea para ejecutar lineas de coamndo en el sistema operativo, a diferencia de la función exec, permite continuar en el programa una vez ejecutados los comandos, ejemplo :
      system ('cat archivo|more');
    

    Ejecuta el comando cat sobre archivo concatenado con el comando more, lo cual permite revisar el archivo página por página y posteriormente continua con con la ejecución del programa.

    uc valor
    retorna en mayúsculas la cadena de caracteres especificada por valor, ejemplo :
      uc ('hola mundo'); # retorna 'HOLA MUNDO'
    
    ucfirst valor
    retorna el primer caracter en mayúsculas de la cadena especificada por valor, ejemplo :
      ucfirst ('hola mundo'); # retorna 'Hola mundo'
    
    unlink lista
    borra una lista de archivos especificados por lista. Se puede emplear el metacaracter '*', si se quiere borrar todos los archivos con extención '.back' se haría de la siguiente forma :
       unlink <*.back>;
    
    undef valor
    esta función permite quitar la definición de una variable, un vector o una subrutina, de la siguiente forma :
      undef $variable
      undef @vector
      undef %vector asociado
      undef &subrutina
    
    unshift (@vector, lista)
    inserta al comienzo de un vector los campos especificados por lista.
    values %vector
    retorna los valores del vector asociado, en el orden ascendente del taman~o de la clave, ejemplo :
      $vector{'ss'} = 'hola';
      $vector{'s'} = 'holas';
      print (join(' ', values %vector));
    
        # imprime 'holas hola'
    
    write archivo
    permite escribir en el archivo especial especificado por archivo los registros formateados por instrucción format en la definición de un reporte de un reporte, ejemplo :
      select (REP);
      write;
    

    En el anterior caso se selecciona el reporte especificado por el archivo especial REP (definido por la instrucción format), posteriormente se escribe el reporte con la función write, cuando se selecciona un archivo especial la función write actua por defecto sobre el archivo especial seleccionado como en el anterior caso.


    Utilidades

    En esta sección se mostrará algunas de las herramientas de las cuales dispone el lenguaje perl, entre estas herraminetas tenemos :

  • Reportes : esta herramienta permite elaborar informaes a partir de cualquier entrada suministrada por la función open, la estructura de estos reportes se puede mostrar de la siguiente manera :
    1. Descripción del formato : esta parte permite disen~ar la estructura del reporte, los textos, los campos y su longitud, un ejemplo claro de como elaborar un reporte se lo puede hacer de la siguiente forma :

      Se tiene como archivo de usuarios el siguiente :

      root:x:10:20:Nuestro gran Guru:/directotio/root:/shell
      univalle:x:88:420:Universidad del Valle:/directorio/univalle:/shell
      gasparin:x:89:100:El Fantasma:/directorio/gasparin:/shell
      calvin:x:90:100:El Travieso Calvin:/directorio/calvin:/shell
      hobbes:x:91:100:El Tigre Hobbes:/directorio/hobbes:/shell
      popeye:x:92:101:El Marino Guapo:/directorio/popeye:/shell
      gonso:x:93:102:El Divertido Gonso:/directorio/gonso:/shell
      

      se quiere sacar un encabezado en donde tenga el nombre de la institución, el número de página y la fecha, poteriormente el usuario, el login y el directorio.

      La definición del anterior requerimiento de la haría de la siguiente forma :

      format top = 
                     UNIVERSIDAD DEL VALLE
             	  Lista de Usuarios de "Farallones"   
      @<<<<<	         		             @<<<<<   @|||
      $fecha,				             Pagina,  $%
      
      Usuario                   Login          Directorio
      ----------------------------------------------------------
      .
      

      Observese que en la definición del encabezado se involucra la definición del campo fecha y pagina, estos campos pueden ser de tipo variable o constantes como la palabra "Pagina", además cada campo se separa con coma ",", la longitud de los campos y su alineación se explican a continuación.

      La definición de los campos que se asignarán al leer el archivo sería :

      format STDOUT =
      @<<<<<<<<<<<<<<<<<<<<<    @|||||||||    @>>>>>>>>>>>>>>>>
      $nombre,		  $login,       $directorio
      .
      

      El anterior ejemplo muestra la forma como se definen la longitud de los campos junto con su alineación y su valor, es el caso del campo nombre el símbolo @<< define un campo con alineación izquierda, y $nombre es el nombre de la variable que guarda el el nombre del usuario, posteriormente se define @|||| que representa un campo con alineamiento centrado incluyendo el valor del login que encuentra almacenado en la $login, finalmente se define el ultimo campo con @>>> que representa un campo con alineación derecha cuyo valor se encuentra en la variable $directorio.

      Una vez definida la estructura del reporte es necesario crear el procedimiento que permite asiganarle el valor a las varibles e imprimir el reporte :

      open(ARCH,'/etc/passwd') || die "Error : $!\n"; # abre archivo
      
      while(<ARCH>) { # empieza el ciclo de manipulación
      
       ($login,$x,$num,$grup,$nombre,$directorio) = split(/:/); # asigan los
      							  # valores
        write;  # escribe el reporte
      
      }  # termina el ciclo de manipulación
      

      La anterior fue una de las formas de emplear la definición del reporte con la salida estandar (STDOUT); así como se empleó la salida estandar se pudo haber empleado cualquier otro nombre para definir el formato pero con la diferencia de primero se debe seleccionarlo (depues de la función open()) con la función select ( select(nombre) ) y además especificar el nombre con la función write ( write(nombre)).

      Si se tomara el archivo '/etc/passwd' como el archivo descrito anteriormente se tendría la siguiente salida click aquí.

      Algunos de los términos como longitud de p`agina del reporte, número de lineas a imprimir se estudiaron en la sección términos reservados.


  • Referencias de Perl

    1. Página de Ayuda en HTML del Sistema (en Inglés)
    2. Grupos de Discusión
    3. comp.lang.perl.announce
    4. comp.lang.perl.misc
    5. Pagina sobre Perl en www-cgi.cs.cmu.edu