Introducción al Lenguaje PERL

Iniciado por Dr.SysCrack, 19 Noviembre 2007, 03:04 AM

0 Miembros y 1 Visitante están viendo este tema.

Dr.SysCrack

PERL es un lenguaje interpretado que tiene varias utilidades, pero está principalmente orientado a la búsqueda, extracción y formateado de ficheros de tipo texto. También es muy usado para manejo y gestión de procesos (estado de procesos , conteo y extracción de parámetros característicos, etc...).

Es una combinación de las características de los lenguajes más usados por los programadores de sistemas, como son los shell del sistema operativo UNIX, los utilidad (que incluye un lenguaje interpretado propio) awk para formateo y tratamiento de texto e incluso caracteristicas de Pascal, aunque su potencia se basa en la similitud con las mejores características del lenguaje estructurado C. En general cualquier utilidad que se necesite realizar en sh, awk, o sed, se puede implementar de una manera mas potente y sencilla mediante el lenguaje PERL.

Algunas de las ventajas del uso del lenguaje PERL son las siguientes:

    * Construcción de pequeños programas que pueden ser usados como filtros para obtener información de ficheros, realizar busquedas, ...
    * Se puede utilizar en varios entornos, como puede ser Windows 95, OS/2, ..., sin realizar cambios de código, siendo unicamente necesario la introducción del interprete PERL correspondiente a cada sistema operativo.
    * También es uno de los lenguajes mas utilizados en la programación de CGI scripts, que son guiones o scripts que utilizan el interface CGI (Common Gateway Interface), para intercambio de información entre aplicaciones externas y servicios de información.
    * El mantenimiento y depuración de un programa en PERL es mucho más sencillo que la de cualquier programa en C.

Un primer programa en PERL
En primer lugar para ejecutar un programa en PERL podemos hacer dos cosas:

    * Llamar desde la línea de comandos al interprete PERL, pasando como parámetro el nombre del programa.

      % perl primer.pl

      La extensión pl no es necesaria, pero se suele poner.

    * Añadir en la primera línea del programa lo siguiente :

       #! /usr/bin/perl

      Ademas debemos cambiar los permisos del fichero fuente, para poderlo ejecutar.
      Esto se realiza mediante la instrucción chmod:

        chmod u+x primer.pl

      A continuación de la primera linea escribiríamos el guión del programa, y una vez hecho esto simplemente invocaríamos el nombre del programa directamente desde la línea de comandos.

      % primerl.pl

Los caracteres #! sirven para denotar que lo que viene a continuación hace referencia a un interprete de comandos.

Por ejemplo un perl scripts que mostrará por la pantalla el mensaje HOLA MUNDO se haría de la siguiente forma:


#! /usr/bin/perl
print "HOLA MUNDO\n";

Tipos de datos en PERL
Perl tiene tres tipos de datos:

   1. ESCALARES.
   2. ARRAY DE ESCALARES.
   3. ARRAYS ASOCIATIVOS DE ESCALARES.

El tipo de dato escalar es denotado mediante un nombre de variable precedido del simbolo $, y puede contener un número , una cadena de caracteres, y una cadena de caracteres en la que alguno de los caracteres puede ser un carácter especial.

Por ejemplo, si queremos definir una variable de tipo escalar llamada número y que contenga el número 12 haríamos:

    $numero = 12;

Para almacenar una cadena de caracteres podemos hacer dos cosas:

    * Definir el contenido entre comillas simples, no interpretandose ningún carácter especial contenido entre ellas, un ejemplo podría ser :

       $palabra = 'perros';

    * Definir el contenido entre comillas dobles , interpretandose cualquier caracter especial contenido entre ellas a la hora de la impresión de la cadena, un ejemplo podría ser:

       $palabra = " perros \n";

Por  último, podemos definir varias variables al mismo tiempo utilizando los paréntesis por ejemplo:

($palabra1,$palabra2,$palabra3) = ("JUAN","PEPE","LUIS");

El tipo de dato array de escalares es denotado mediante un nombre de variable precedido del símbolo @. Un ejemplo de inicialización de una variable de este tipo podría ser:

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

El número de elementos menos uno de un array de escalares se puede obtener mediante el nombre de la variable precedido de los simbolos $#, por ejemplo si queremos obtener el número de elementos de @frutas haríamos:

$numero_de_elementos = $#frutas+1;

Para ser más exactos $# nos devuelve el último indice del array, así, si el valor para el primer indice es 0 el número de elementos - 1 será el  último valor permitido para indexar el array.

El acceso a un elemento de un array se hace mediante un índice numérico de la forma $nom_variable [ indice ] ; asi, si quisieramos acceder al tercer elemento de @frutas haríamos:

$2_elemento =  $frutas[2];

También podemos acceder a varios elementos de un array de la forma @nom_variable[indice1,...,indicen], por ejemplo:

print @frutas[1,2];

imprimirá el elemento segundo y tercero del array @frutas.

Otra forma de indexar un array es usando el operador rango .. , si quisieramos imprimir todos los valores desde un indice i hasta un indice j deberiamos utilizar el siguiente formato @nom_variable[i..j], por ejemplo:

print  @frutas[0..2];

imprimirá todos los elementos del array @frutas.

Por último tenemos también el tipo de dato array asociativo de escalares, mediante este tipo de datos podemos acceder a un determinado elemento de un array a través de una clave anteriormente definida, para denotar este tipo de dato debemos preceder al nombre de la variable con el símbolo % . Un ejemplo de definición de claves y valores de un determinado array asociativo podria ser:

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

Si queremos acceder a un elemento de un array asociativo, debemos seguir el siguiente formato @nom_variable { clave }, un ejemplo podría ser:

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

Sintaxis general
Como ya habrás podido observar todas las intrucciones de PERL deben terminar en ";".

Ejemplo

$numero = 2; print $numero;

Además las únicas cosas que deben de ser declaradas en PERL son los formatos de salida o reports y las subrutinas. Todas las variables creadas y no inicializadas tienen como valor por defecto nulo o cero. Los comentarios deben ir precedidos del símbolo #. Ahora veremos de forma práctica el uso de las sentencias de control condicionales e iterativas que suministra el lenguaje PERL para alterar el flujo de un programa.

En primer lugar entenderemos como BLOQUE a todo conjunto de sentencias que se encuentren entre dos llaves, por ejemplo lo siguiente sería un bloque:

{
  $numero=2;
  print $numero;
}

Los bloques, además, pueden ser etiquetados anteponiendo a la llave de apertura el nombre de la etiqueta mas dos puntos.

En segundo lugar entenderemos como EXPRESION a toda expresión cuya evaluación resulte ser un valor booleano, es decir, verdadero o falso. Hay que tener en cuenta que en PERL se considera como verdadero todo valor no nulo luego se pueden presentar como expresiones el resultado de una asignación,de una búsqueda etc...

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

    * Esquemas condicionales.
    * Esquemas iterativos.

Dentro de los primeros tenemos los siguientes formatos:
#   if (EXPRESION) BLOQUE. Un ejemplo de uso podría ser:

print " PENSANDO UN NUMERO ....\n";

$numero = rand(100);

print "Introduce un numero del 1 al 100:";

$entrada = <STDIN>;

if($entrada == $numero) {print "Has acertado el numero\n";}

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

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

print " EL NUMERO PENSADO ERA:",$numero;

if (EXP) BLOQUE else BLOQUE. Un ejemplo podria ser:

print " PENSANDO UN NUMERO ....\n";

$numero = rand(100);

print " Introduce un numero del 1 al 100:";

$entrada = <STDIN>;

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

# if (EXP) BLOQUE elsif (EXP) BLOQUE .... else BLOQUE. Un ejemplo podria ser:

print " PENSANDO UN NUMERO ....\n";

$numero = rand(100);

print " Introduce un numero del 1 al 100:";

$entrada = <STDIN>;

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

En lugar de if podemos usar unless que tiene el significado contrario.

Dentro de los esquemas iterativos tenemos:

# while (EXP) BLOQUE . Mientras se cumpla la condición EXP se ejecutará todo lo que haya en bloque. Un ejemplo podría ser:

print " PENSANDO UN NUMERO ....\n";

$numero = rand(100);

$entrada = $numero+1;

while ($entrada > $numero)
{
   print " Introduce un numero del 1 al 100, menor que el pensado:";

   $entrada = <STDIN>;

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

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

En lugar de while podemos usar until, que tiene el efecto contrario a éste. Si además queremos hacer la primera comparación después de la primera iteración, podemos usar un esquema iterativo do BLOQUE until o do BLOQUE while.

# for (EXP;EXP;EXP), su uso es exactamente igual que en C; un ejemplo de uso sería:

  print "IMPRIMIENDO DEL 1 al 100:\n";
  getc;

  for($i=1;$i<101;$i++)
  {
    print $i."\n";
  }

Y por último tenemos:

# foreach VAR (ARRAY) BLOQUE, con este esquema vamos obteniendo cada uno de los valores que contiene ARRAY y los vamos depositando en la variable VAR. Un ejemplo podría ser:

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

foreach $fruta (@frutas)
{

   print $fruta."\n";
}

Subrutinas

Otro aspecto de interés en PERL es la definición y manejo de subrutinas.

El formato de declaración de una subrutina es:

sub NOMBRE BLOQUE

Ejemplo :

sub HOLA
{
   print  "HOLA\n";
}

La llamada a la subrutina la haríamos usando:
#   do nombre_de_la_subrutina();

# &nombre_de_la_subrutina;

Las dos formas producen el mismo resultado con la excepción de que en el caso de do hay siempre que poner los paréntesis, si queremos pasar argumentos debemos pasar los argumentos entre estos paréntesis, y estos serán almacenados en el array de escalares @_, es decir para saber el número y el valor de los argumentos pasados a una subrutina hay que leer de este array predefinido.

Un ejemplo podría ser el siguiente:

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

  &imprime ("HOLA\n");

En el ejemplo anterior se usa la función local(), que sirve para declarar variables locales a la subrutina, por supuesto podríamos haber referenciado directamente el array @_.

El valor retornado por la subrutina es el de la última expresión evaluada, y puede ser tanto un array como un escalar. También podemos devolver explicitamente un valor usando return, como en C.

También resulta interesante la declaración y uso de formatos o reports. Con la definición de un report, estamos alterando el formato de salida de los registros cuando utilizamos la función write.

La sintaxis para la definición de un formato es:

       format NOMBRE =
       FORMLIST
       .

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

SANGRADO_CAMPO1,SANGRADO_CAMPO2,...,SANGRADO_CAMPON variable1, variable2,.........,variablen

El tipo de sangrado se consigue usando los símbolos:

    * < : sangrado a la izquierda.
    * > : sangrado a la derecha.
    * | : texto centrado.

Pondremos tantos símbolos como la longitud máxima requerida para representar el valor de la variable asignada a ese campo, además al principio de la definición de los campos de sangrado debe estar el símbolo @.

Un ejemplo de salida formateada podría ser:


format STDOUT_TOP =


                        SALIDA FORMATEADA DE WHO
.


format STDOUT =

                     
Usuario                      Conectado en               Momento de la conexion
______________________________________________________________________________

@<<<<<<<<<<<<<<<<<<<<<<<<<@|||||||||||||||||||||||@>>>>>>>>>>>>>>>>>>>>>>>>>
$usuario                  ,$tty                    ,$conectado
                     
.

open(WHO,"who|");

while ($who = <WHO>)
{
    chop $who;
    ($usuario,$tty,$conectado) = split(/\s+/,$who,3);
    write;

}
close(WHO);

Operadores en PERL.
PERL soporta una gran cantidad de operadores, la mayoría de ellos heredados del lenguaje C. En PERL los operadores conservan el mismo uso que en el resto de los lenguajes, y se utilizan para realizar operaciones aritméticas, operaciones lógicas ..., entre las variables del programa. Los operadores pueden clasificarse en los siguientes tipos:

    * Operadores de comparación: mediante estos operadores podemos enfrentar dos expresiones, de manera que dependiendo de su valor se generará un resultado que puede ser lógico o numérico. PERL tiene los siguientes operadores de comparación:

          o ==. Este operador sirve para comparar dos valores iguales, de manera que cuando las expresiones a su izquierda y su derecha son iguales, devuelve un valor lógico verdadero y cuando no lo son devuelve falso:

                      if ($var == 3) { ...}

            en el caso de que el contenido de la variable sea tres se realizan las operaciones entre paréntesis.

          o eq. Es empleado para comparar expresiones no numéricas, esto es, se utiliza de igual manera que == pero para cadenas.

          o !=. Con este operador se comparan cantidades numéricas diferentes.

                      if ($var != 3) { ...}

            si los valores son diferentes se ejecutan la instrucciones entre llaves.

          o ne. Se utiliza para comparar cantidades no numéricas diferentes. Su funcionamiento es similar que el de !=.

            ;
          o <. Verifica el valor de una cantidad numérica con repecto del valor de la expresión de la derecha, de modo que si el valor de esta expresión es mayor que el de la cantidad numérica se devuelve cierto, en caso contrario se devuelve falso:

                      if ($var < 3) { ...}

            ejecuta las instrucciones entre paréntesis si el valor de var es menor que tres.

          o >. Verifica el valor de una cantidad numérica con repecto del valor de la expresión de la derecha, de modo que si el valor de esta expresión es menor que el de la cantidad numérica se devuelve cierto, en caso contrario se devuelve falso:

                      if ($var > 3) { ...}

            ejecuta las instrucciones entre parentesis si el valor de var es mayor que tres. Los operadores para los terminos menor o igual y mayor o igual son <= y >= respectivamente, y en ambos casos además de el significado de cada término explicado anteriormente, se devuelve cierto si las expresiones son iguales.

             Como en el caso de las operaciones anteriores, existen equivalentes que se utilizan con las cadenas no númericas para los terminos < y >. Estos operadores son: ltque devuelve cierto si el orden de la cadena de la izquierda es menor que el de la cadena de la derecha, y gt que devuelve cierto si la cadena de la izquierda es mayor que el orden de la cadena de la derecha.

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

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

          o <=>. Este termino se utiliza para comparar valores numéricos, retornando 0 cuando son iguales, 1 cuando el termino de la derecha es menor que el de la izquierda y -1 en el caso contrario.

          o =~ . Este termino es usado en las expresiones regulares para indicar la presencia de un patrón de comparación dentro de una variable que contiene una cadena de caracteres:

                      if ($var =~/pepe/) { ...}

            verifica si la cadena 'pepe' se encuentra dentro de var y si es así, ejecuta el código entre llaves.

          o !~. Mediante este operador se verifica la no existencia del patrón de búsqueda en una cadena:

                      if ($var !~/pepe/) { ...}

            si la cadena 'pepe' no esta en var se ejecuta el código entre llaves.

    * Operadores de asignación: los terminos de asignación se utilizan en PERL para dar valores a cualquiera de las variables validas en PERL. Existen en Perl los siguientes operadores de asignación:

          o =. Con este termino se asigna a la variable que se encuentra a la izquierda del operador el valor de la expresión de la derecha. Asi mediante este valor se pueden dar valores iniciales a cualquier variable:

                      $var = 'Buenos dias';

            asigna la cadena 'Buenos dias' a la variable var.

          o =~. A parte de la función de verificación de existencia de un patrón dentro de una cadena que anteriormente se explicó, este operador dentro de una expresión regular de sustitución se utiliza para sustituir un patrón de comparación por otra cadena:

                      $var =~ s/one/uno/;

            se reemplaza la ocurrencia de la cadena 'one' por la cadena 'uno'.
             

    * Operadores aritméticos: Mediante estos terminos se realizan las operaciones aritméticas necesarias para el manejo de las expresiones. A parte de los operadores aritméticos comunes; +(suma), -(resta), *(multiplicación) y /(división), PERL también incluye los siguientes operadores:

          o **. Este término se emplea para obtener la potencia de un valor numérico, ejemplo :

             $var = 6;
             $var**2;

            el valor almacenado en var es 36.

          o .  ;Este término se emplea para concatenar dos cadenas de caracteres, ejemplo:

              $var = 'Juan ';
              $var . 'Ramirez';

            var contendrá la cadena Juan Ramirez.

          o x. Este término multiplica n veces la cadena de caracteres especificada, ejemplo :

              'd' x 20;

            expresa una cadena de 20 caracteres d.

          o %, Permite obtener el módulo de la división entre dos números, ejemplo :

              $var = 5 % 2;

            el valor que se asigna a var es 1.

          o |. Este término cuando se emplea entre 2 valores numéricos, permite realizar una operación binaria 'o' entre ellos, ejemplo

              $var = 3 | 2;

            el valor que se asigna a la variable es 3.

          o &, Este término cuando se emplea entre 2 valores numéricos, permite realizar una operación binaria 'y' entre ellos, ejemplo :

              $var = 3 & 2;

            el valor asignado es 2.

      El operador de asignación = está muy relacionado con los operadores aritméticos de modo que PERL permite que se combinen ambos siguiendo este formato general:

        $variable (operador aritmetico)= expresión;

      En general lo que se consigue con este formato es realizar la operación aritmetica, y posteriormente asignar el valor a la variable. Así aquí vemos algunos ejemplos de esta combinación:

        $var = 5;
        $var += 6;

      después de esta asignación el valor de var sera 11 (ha sumado 6 al valor anterior de la variable y posteriormente ha asignado el resultado).

        $var = 5;
        $var %= 2;

      el valor actual de la variable sera 1.

    * Operadores lógicos o relacionales: permiten relacionar dos o más expresiones condicionales para determinar si el resultado lógico es falso o cierto. Estos son los diferentes operadores lógicos que emplea PERL:

          o |. Este operador se utiliza en las expresiones regulares como operador lógico 'o', de modo que retorna cierto siempre que cualquiera de los patrónes de busqueda que componen la expresión sea cierto y falso cuando los dos son falsos. Por ejemplo

                      if ($var !~/pepe | juan/) { ...}

            el código entre llaves se ejecuta si en la cadena que se encuentra dentro de la varible existe una ocurrencia igual a 'pepe' o igual a 'juan'.

             Además de utilizarse dentro de las expresiones regulares, también se utiliza para unir mediante la operación 'o' dos expresiones condicionales. Así por ejemplo:

                      if ($var == 6 | $var < 3) { ...}

            ejecuta el código entre llaves si la variable es igual a 6 o menor que 3.

          o ||. También representa la operación lógica 'o' pero en este caso se utiliza sobre instrucciones no sobre expresiones.

          o &. Este operador trabaja como un operador lógico 'y' en expresiones regulares, permite confrontar 2 patrones, de modo que para que se produzca un valor cierto se tiene que cumplir la existencia de ambos en la cadena donde se realiza la comparación, en el caso contrario el valor devuelto es falso, ejemplo:

                 if ($var =~ /coche & moto/) { ...}

            el código entre parentesis se ejecuta si dentro de la variable existe una ocurrencia de la cadena 'coche' y otra de la cadena 'moto'. Como en el caso del operador | también se utiliza para relaccionar expresiones condicionales.

          o &&. 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 sobre expresiones regulares.

          o !. Con este operador realizamos una evaluación negativa de la expresión, ejemplo:

                  if (!$var) { ...}

            el código entre llaves se ejecuta si la variable var es nulo o 0.

    * Operadores de Archivo: estos operadores se emplean para verificar en el sistema operativo los permisos de un archivo, o su naturaleza de ejecución, etc. A continuación se muestra los diferentes operadores:
          o -r : indica si el archivo tiene permiso de lectura.

          o   -W : indica si el archivo tiene permiso de escritura.

          o   -T : indica si el archivo es de tipo texto.

          o   -e : indica si el archivo existe.

          o   -z : indica si el archivo tiene tamaño 0.

          o   -s : indica si el archivo es mayor que 0.

          o   -f : indica si el archivo es plano.

          o   -d : indica si se trata de un directorio.

          o   -M : indica el número dias después de la última modificación

          o   -B : indica si el archivo es binario.

          o   -t : indica si el archivo esta abierto en un terminal.

             

Variables predefinidas
Los siguientes nombres tienen un significado especial en PERL sólo incluiremos los más frecuentes, para una información más detallada consulte el manual de usuario:

    * "$_"  contiene el contenido del último registro leido de un fichero.
    * "$. " contiene el número de la última línea leida de un fichero.
    * "$/ " separador de campo para la entrada.
    * "$,"  separador de campo para la salida, aplicable a print.
    * "$\ " separador de registro para la salida, aplicable a print.
    * "$~" contiene el nombre del formato o report definido para la salida actual.
    * "$^" contiene el nombre de la cabecera de formato o report definido para la salida actual.
    * "$$" número de proceso perl scripts que se esta ejecutando actualmente.
    * "$&" representa el valor de la última cadena de caracteres comparada exitosamente.
    * "$`" y "$'" estos dos terminos se utilizan conjuntamente para separar cadenas de caracteres comparadas exitosamente.
    * "$!" contiene el valor actual de ERRNO, es decir, el último error acontecido.
    * "$0" contiene el nombre del fichero que hemos dado a nuestro perl script.
    * "$[" contiene el valor del primer indice de una array de escalares, por defecto es 0.
    * "$<" uid real del proceso actual.
    * "$>" uid efectivo del proceso actual.
    * "$(" gid real del proceso actual.
    * "$)" gid efectivo del proceso actual.
    * @ARGV contiene los parámetros pasados a nuestro perl script.
    * %ENV array asociativo que contiene las variables de entorno bajo el que se ejecuta nuestro perl script.

Expresiones regulares.
Las expresiones regulares en PERL nos permiten evaluar o comparar la existencia de un patrón de búsqueda en una cadena o un valor determinado; así por ejemplo, si se tiene un archivo de muchas líneas y se quiere imprimir las líneas que tengan en su inicio un determinado carácter, o se desea reemplazar todas las ocurrencias de una determinada palabra dentro del fichero, se deben emplear las expresiones regulares. Se pueden dividir las expresiones regulares en los siguientes tipos:

    * Expresiones regulares de comparación : Nos permiten evaluar si un patrón de búsqueda se encuentra en una cadena de caracteres, de modo que mediante este tipo de expresiones regulares obtendremos un valor lógico verdadero o falso según se encuentre el patrón deseado. La sintaxis de este tipo de expresiones regulares es la siguiente:

              valor a comparar =~ /patrón de búsqueda/;

      El principal uso de las expresiones regulares de comparación es la formulación de condiciones en cualquiera de las estructura lógica estructuras lógicas permitidas en PERL. Las expresiones regulares de comparación soportan la siguiente opción:

          o i; formato: /(PATRON)/i. Mediante esta opción se consigue que la comparación entre la variable y el patrón se realize sin importar minúsculas o mayúsculas.

    * Expresiones regulares de sustitución: Esta herramienta permite cambiar los patrones de busqueda por caracteres nuevos definidos por el usuario que componen el patrón de sustitución, la sintaxis es la siguiente :

        valor a sustituir =~ s/patrón de búsqueda/sustitución/;

      Dentro de las expresiones regulares de sustitución encontramos las siguientes opciones:

          o opción: i; formato: (s/PATRON DE BUSQUEDA /SUSTITUCION DE SUSTITUCION/i) : funciona de igual manera que en el caso de una comparación, ignora las mayúsculas en el reemplazo.

          o opción: g; formato: (s/PATRON DE BUSQUEDA /PATRON DE SUSTITUCION/g) : esta opción permite reemplazar todas las ocurrencias del patrón de búsqueda. En el caso de no emplear esta opción, la sustitución se realizará sólo con la primera ocurrencia del patrón de sustitución.

          o opción: e; formato: (s/PATRON DE BUSQUEDA/PATRON DE SUSTITUCION/e): con esta opción se puede evaluar la parte de la sustitución (SUSTITUCION),con valores devueltos por una función.

    * Expresiones regulares de traducción: Este tipo de expresiones regulares tienen una manera de trabajar muy parecida a la de las sustituciones. En este caso se trata de comparar uno a uno los caracteres del patrón de búsqueda con los de la cadena de sustitución, de modo que cada vez que se encuentra una ocurrencia que coincide con uno de los caracteres del patrón se intercambia por su correspondiente en la cadena del patrón de sustitución. La sintaxis general de esta expresión regular es la siguiente:

         variable =~ tr/(patrón de búsqueda)/(cadena_a_traducir)

      Las expresiones regulares de traducción no tienen opciones, la búsqueda y sustitución se realiza en el contenido de toda la variable.

       Pasamos a mostrar un ejemplo que ilustre todo lo anteriormente dicho de las expresiones regulares:

       Supongamos que tiene un archivo de tipo texto con el siguiente contenido:

        tres perros tres gatos y tres elefantes.

      Las siguientes expresiones regulares casuarán los efectos que se especifican:

       open(AR,'prueba.prb')|| die "$!\n";
       while(<AR>)
        {
          if( $_ =~ /tres/ )
          { print "Se ha encontrado la cadena 'tres'";}
        }

      El segmento de código anterior realiza las siguientes operaciones: abre un fichero prueba.prb de tipo texto y lo asigna a la variable AR, trás lo cual realiza un bucle while que permite recorrer todo el contenido del fichero. Dentro de este bucle, utilizando la variable predefinida $_ (que guarda el contenido de la última línea del fichero definido como entrada); observa mediante una condición if si dentro del registro existe una cadena igual a 'tres'. Como se ve dentro de la condición se utiliza una expresión regular de comparación que devolverá cierto si se encuentra la cadena patrón dentro de la variable ( en este caso el contenido de una línea). En el caso de que la expresión regular devuelva cierto se indica que se encontró la cadena buscada.

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

      Este ejemplo, entra de manera similar al anterior dentro del fichero prueba.prb, tras lo que sustituye dentro de este fichero todas las ocurrencias de la cadena 'tres' por la cadena '---'. Esto se realiza mediante una expresión regular de sustitución. Con esto la salida por pantalla sería la siguiente:

           --- perros --- gatos y --- elefantes.
         
       open(AR,'prueba.prb') || die "$!\n";
       while (<AR>)
        {
         $_ =~ tr/tre/1234/;
         print ;
        }

      La salida por pantalla de este ejemplo es la siguiente:

       123s p322os 123s ga1os y 123s 313fan13s.

      El código anterior realiza una traducción en el contenido de nuestro fichero prueba.prb, el cual es abierto de la misma manera que en los otros casos. Como se ve en el resultado, cada vez que hay una ocurrencia del caracter 't' este se sustituye por '1', cuando aparece un caracter 'r' la sustitución se hace por el '2' y por último cuando aparece un caracter 'e' la traducción lo sustituye por el tercer valor de la cadena de sustitución, en este caso 3. El caracter de sustitución 4 es ignorado ya que no tiene correspondencia con ninguno de los caracteres del patrón (solo hay tres caracteres en el patrón).

       open(AR,'prueba.prb') || die "$!\n";
       while (<AR>)
        {
          $_ =~ tr/tre/12/;
          print ;
        }

      La salida por pantalla de este ejemplo es la siguiente:

       122s p222os 122s ga1os y 122s 212fan12s.

      Este ejemplo es idéntico a el anterior pero en este caso sólo tenemos dos caracteres en la cadena de sustitución. Así, cuando el número de caracteres en la cadena de sustitución es menor que el número de caracteres del patrón, las ocurrencia de los caracteres del patrón que no tienen correspondencia con ningún caracter de sustitución, son intercambiados por el último de los caracteres de sustitución.

    * Caracteres Especiales. Los caracteres especiales en PERL están intimamente relacionados con las expresiones regulares, ya que estos se suelen usar para denotar ocurrencias como fin de línea, comienzo de línea, un tabulador ..., lo cual como se verá es especialmente práctico dentro de la utilización de las expresiones regulares. Estos son los caracteres especiales que pueden utilizarse en PERL:

          o Carácter: ^ ; comienzo de línea. Con este caracter expresamos el comienzo de una cadena o registro de caracteres. Así por ejemplo supongamos que se quiere escribir una variable si en su parte inicial se encuentra la cadena 'XXX'. El fragmento de código en PERL que realiza esto sería el siguiente:

              if($var  =~ /^XXX/)
                {
                   print $var;
                }

          o Carácter: $ ; final de línea. Paralelamente al caracter anterior este expresa el final de una cadena o un registro de caracteres. Así, si deseamos escribir una variable si en su parte final contiene la cadena 'END' se escribiría la siguiente expresión regular:

              if($var =~ /$END/)
                {
                  $var; print
                }

          o Carácter: ( ) ; paréntesis. Estos se utilizan en PERL para delimitar ciertos patrones de comparación, para posteriormente aplicarles un operador de repetición o una referencia a patrón.

          o Carácter: [ ] ; corchetes. Se utilizan para delimitar dentro de un determinado patrón un conjunto de caracteres que pueden encontrarse dentro de la variable afectada por una expresión regular. Así por ejemplo, supongamos que en una determinada cadena se quieren sustituir todas las ocurrencias de los números 1 ó 4 por la cadena 'X_X'. Para realizar esta sustitución se utilizan los corchetes de la siguiente manera:

                      $var = '1sdffl3l54l6y547';
                      $var  =~ s/[14]/X_X/g;
                      $var;  print

            La salida por pantalla del ejemplo será la siguiente:

              X_Xsdff1315X_X6y5X_X7

            Cuando se utiliza el carácter ^ con los corchetes, queremos decir la no existencia de la cadena que está entre los corchetes. Así si nuestro ejemplo hubiese sido de esta manera:

                      $var = '1s4s547';
                      $var =~ s/[^14]/X_X/g;
                      $var; print

            la salida por pantalla sería la siguiente:

              1X_X4X_XX_X4X_X

          o Carácter: - ; guión. Mediante este carácter denotamos un rango de caracteres o números. Así por ejemplo, si queremos sustituir en una variable o texto todas las palabras minúsculas por palabras mayúsculas lo realizaremos mediante la siguiente expresión regular que intercambia cualquier ocurrencia de un caracter en minúscula por su correspondiente el mayúsculas:

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

          o Carácter: { } ; llaves. Dentro de una expresión regular representa la longitud de una cadena. Así para referenciar una cadena de caracteres con tres caracteres ? se expresa de la siguiente manera:

             /?{3}/

          o Carácter: . ; punto. Sirve para representar cualquier carácter. Asi supongamos que queremos sustituir los cuatro primeros caracteres de una cadena:

                      $var = 'Paco Gomez';
                      $var =~ s/.{4}/Manolo/;
                      print $var;

            así la salida que se obtiene es la siguiente:

             Manolo Gomez

          o Carácter: \d . Mediante este caracter se significa la existencia de un dígito. Como ejemplo imaginemos que se quieren sustituir todos los dígitos de una variable por el caracter XXX, lo que se hace de la siguiente manera:

                      $var = '1flying burrito2';
                      $var =~ s/\d/XXX/;
                      print $var;


            la salida por pantalla es:

             XXXflying burritoXXX

            Los siguientes caracteres tienen un significado paralelo al anterior por lo que no se darán ejemplos de ellos:
          o   Carácter: \w . Expresa un carácter alfanumérico.
          o Carácter: \b . Expresa un espacio en blanco.
          o Carácter: \t . Significa un tabulador.
          o Carácter: \r . Expresa un retorno de carro.
          o Carácter: \n . Significa un final de línea.
          o Carácter: \s . Expresa un separador de cadena de caracteres.

      Los anteriores caracteres especiales, en su formato en mayúsculas significan lo contrario, esto es, \W expresa un carácter no alfanumérico, \D expresa un valor no numérico ... Por último el carácter \ permite referenciar un caracter especial en PERL como un carácter normal, así por ejemplo la siguiente sentencia:

           $var =~ s/\\d/XXX/g;

      nos permite sustituir todas las ocurrencias de la cadena \d por XXX. Si dentro de la expresión regular se hubiese escrito solo \d, la sustitución se realizaría en todos los valores numéricos. En general ocurre lo mismo con el resto de caracteres especiales de PERL.

    * Operadores de Repetición. Como los caracteres especiales, también se encuentran muy unidos a la aplicación de las expresiones regulares. En este caso, este tipo de operadores nos permiten repetir un número determinado de veces una cadena de caracteres dentro de una expresión regular.

      Los operadores de repetición son los siguientes:

          o Operador: * ; con él podemos representar un patrón 0 ó más veces. Así supongamos que se quieren sustituir en una cadena todas las ocurrencias de la expresión 'EO' al final de una cadena de caracteres por 'XX',de modo que a priori no podemos conocer el número de ocurrencias de 'EO'. Para resolver este problema se utilizará el operador * de la siguiente manera:

                      $var = 'EOflyingburritoEOEOEO';
                      $var =~ s/(EO)*$/XX/;
                      print $var;

            La salida de este programa en PERL es la siguiente:

             EOflyingburritoXX

            Como se observa, ha sustituido un número indeterminado de ocurrencias de 'EO' al final de la cadena por una sola ocurrencia de la cadena 'XX'. Si no se hubiese utilizado el operador '*' junto con el carácter especial '$', la sentencia habría sustituido todas las ocurrencias de EO por XX. Como se observa en este ejemplo se utilizan los paréntesis para indicar que la operación de repetición afecta a la cadena EO por entero, de no haberse utilizado los paréntesis la repetición afectaría unicamente al carácter O.

          o Operador: + ; este operador funciona de manera similar que el operador '*', pero con la diferencia de que el patrón es representado una o más veces.

          o Operador: ? ; mediante este operador representamos una cadena de caracteres opcional dentro de un patrón. Así si se quiere sustituir la cadena 'usted' y su plural por la cadena '---' se puede realizar el siguiente codigo en PERL:

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

            con esto conseguimos sustituir todas las ocurrencias de la cadena usted o ustedes por '---'.
              Referencia a patrones. Se utilizán para referenciar patrones de comparación o sustitución en las expresiones regulares. PERL trabaja con dos tipos de operadores de comparación:
    *

          o Operador: $1..9 ; sirven para referenciar uno de los patrones de búsqueda de la expresión regular. El número del 1 al 9 representa el patrón al que nos referimos dentro de la expresión regular. Así un ejemplo del uso de este operador se puede observar en este código en PERL que añade el artículo 'El' a un nombre común:

                      $var = 'PERRO';
                      $var =~ s/(PERRO)/EL $1/;
                      print $var;

            Como se observa utilizamos la referencia $1 para referirnos al primer patrón de búsqueda (la cadena `PERRO` en nuestro caso) dentro del apartado dedicado a los patrónes de sustitución, de modo que dentro de la sustitución se encuentra el patrón de búsqueda. Después de la ejecución la variable $var tiene la siguiente cadena:

             EL PERRO

          o Operador: \1..9 ; este operador tiene la misma utilidad que el anterior, esto es, se utiliza para referenciar patrones de búsqueda, pero en este caso la referencia se realiza en la parte de la expresión regular que se dedica a la escritura de patrones de búsqueda y no en la parte dedicada a los patrónes de sustitución, como en el formato anterior. Así para evaluar el principio y el final de una cadena se escribe el siguiente código:

                      if( $var =~ /^(\w)+.*\1$/ );

            Esta expresión regular de comparación tiene el siguiente significado: mediante la cadena ^(\w)+ nos referimos a todos los caracteres alfanuméricos que forman parte del principio de la cadena contenida en $var, esto es, tomo como primer patrón todos los caracteres alfanuméricos de la cadena; con la cadena .* referencio un conjunto arbitrario de caracteres de longitud desconocida; con la cadena \1 expreso el primer patrón utilizado y con $ significo que este patrón debe de estar al final de la cadena contenida en $var. En definitiva la expresión regular tomará el valor cierto, cuando la cadena de caracteres contenida en $var tenga la misma cadena de caracteres alfanuméricos al principio y al final. Así por ejemplo, si $var tiene una cadena de caracteres como esta: 'hola juansdfa hola' el valor de la expresión regular será cierto, ya que los espacios en blanco no se consideran caracteres alfanuméricos.

Ejemplo de uso de algunas funciones
A continuación se describen algunas de las funciones más utilizadas en la programación de un perl script, esto no pretende ser un manual de referencia luego para conseguir el formato puedes usar el comando man perl:

    * abs: devuelve el valor absoluto de la expresión pasada.
    * chmod: cambia los permisos de los ficheros dados.
    * chop: recorta y retorna el último carácter de una cadena.
    * chown: cambia el propietario de los ficheros dados.
    * close : cierra un fichero.
    * cos: devuelve el coseno del ángulo dado en radianes.
    * defined: sirve para comprobar si existe una variable, formato, subrutina,etc..
    * delete: borra un valor de un array asociativo a través de su clave.
    * die:imprime en la salida del error estándar un mensaje pasado como parámetro cuando ocurre un error en la ejecución de una sentencia.
    * eof: retorna verdadero si el final del fichero dado.
    * eval: evalua la expresión pasada como si se tratase de un pequeño programa perl.
    * exec: ejecuta lo que pasemos como parámetro y sale del programa.
    * exit: hace que salgamos del perl script devolviendo al sistema operativo el valor pasado como argumento.
    * exp: retorna el número e elevado a la potencia pasada como parámetro.
    * fileno: devuelve el descriptor del manejador del fichero pasado como parámetro.
    * fork: realiza una llamada fork.
    * getc: lee el siguiente caracter del fichero especificado.
    * hex: devuelve el valor decimal del numero hexadecimal pasado como parámetro.
    * index: devuelve la posición de la primera ocurrencia de una cadena en otra.
    * int: devuelve la parte entera del parámetro pasado.
    * join: une las cadenas pasadas como argumento con un separador también pasado como argumento.
    * keys: devuelve todas las claves de un array asociativo.
    * length: devuelve la longitud en caracteres del parámetro pasado.
    * local: declara como locales las variables pasadas como argumentos.
    * log: devuelve el logaritmo del número dado.
    * mkdir: crea un directorio en el camino dado.
    * oct: devuelve el valor decimal del numero octal pasado como parámetro.
    * open: abre el fichero fichero dado asociandole un manejador de fichero especificado también como parámetro.
    * pop: retorna y borra el ultimo elemento del array dado.
    * print: muestra en la salida standard o en el fichero especificado la expresión dada.
    * push: añade el valor dado al final del array pasado como parámetro.
    * rand: devuelve un numero aleatorio entre 0 y el valor pasado como argumento.
    * read: lee un determinado numero de caracteres desde el fichero pasado como argumento.
    * rename: sirve para renombrar un fichero.
    * require: sirve para incluir código externo en nuestro guión.
    * return: devuelve un valor desde una subrutina.
    * rmdir: borra un directorio.
    * seek: sitúa un puntero a fichero en un lugar determinado.
    * select: sirve para seleccionar el manejador de fichero que será utilizado por defecto para la salida de los comandos o funciones que no especifiquen un determinado manejador de fichero como parámetro.
    * shift: devuelve el primer valor del array dado borrandolo posteriormente.
    * sin: devuelve el seno del ángulo pasado en radianes.
    * sleep: causa que el perl script o guión se detenga el número de segundos especificados.
    * sort: ordena el array dado.
    * split: divide una cadena en subcadenas según el separador especificado.
    * sqrt: devuelve la raiz cuadrada del número pasado.
    * system: igual que exec pero no se sale del perl script.
    * tell: devuelve la posición actual del puntero a fichero del manejador de fichero especificado.
    * values: devuelve todos los valores del array asociativo dado.
    * write: escribe un registro con formato en el fichero asociado a ese formato.

sa1u2
Fuente:http://kataix.umag.cl/~mmarin/topinf/perl.html
Clickea donde dice Revolution Hack