Capítulo 5

Manual de PERL

Sitio Web para conseguir PERL

CAPITULO 4

 

I. EXPRESIONES REGULARES Y PATRONES DE BUSQUEDA

    Una de las características más potente y usada en PERL es la manipulación de cadenas. Para ello existen una una gran variedad de expresiones y patrones que nos facilitan esta tarea. Para estas expresiones se usan una serie de caracteres especiales que juntos o por separado actúan como patrones de busqueda, comparación o sustitución en una cadena. Estas expresiones se colocan entre 2 barras "/", así: /Hola/ y algunos caracteres con un significado especial que actual como patrones de busqueda, como: ^,*,$,?,etc...

Nota: Ya que "/" se usa como delimitador de expresiones regulares, si queremos buscar algún caracter como éste se escribe así: "\/", es decir, anteponiendo el signo de caracter de control "\".
Ej. Si buscamos una fecha de tipo 01/02/2000, el primer caracter "/" tras 01, podría entenderse como final de la expresión regular. Se escribiría así "01\/02\/2000".

BUSQUEDAS

Ej: Teniendo una cadena como "Hola Mundo", queremos comprobar si dentro de ella se encuentra la palabra "Hola".

$cadena="Hola Mundo";

if ($cadena =~ /Hola/)
    {
    print "Si existe";
   }

# Podríamos traducirlo como "Si  "Hola Mundocontiene "Hola".

Comprobamos que aparece un signo especial  =~  (contiene) para las comparaciones de expresiones. El signo ~  no aparece como una tecla normal en el teclado español. Se obtiene manteniendo pulsada la tecla Alt y pulsando 126 en el teclado númerico.

La situación contraria sería:

$cadena="Hola Mundo";

if ($cadena !~ /Planeta/{
    print "No existe";
   }

# Podríamos traducirlo como Si  "Hola Mundono contiene "Planeta".

Aparece otro signo especial !~ (no contiene) para las comparaciones de expresiones.

    En el ejemplo anterior la comparación es menos restrictiva, o sea, que buscamos la expresión en toda la cadena, sin tener en cuenta mayúsculas y minúsculas, si la expresión está al principio o final de la cadena, etc... Para realizar una comparación más exacta, usamos otros metacaracteres patrones.

Los metacaracteres son una serie de caracteres que se usan con un significado especial y distinto del que representan. Así un asterisco " * " tiene un significado especial y definido por el programador. A continuación veremos los distintos significados que tienen algunos de estos signos.
 

Ej: Buscamos  la palabra "Hola" SOLO al principio de la cadena (^).

$cadena="Hola Mundo";

if ($cadena =~  /^Hola/)
 {
   print "Existe";
 }

# Podríamos traducirlo como Si  "Hola Mundo" contiene "Hola" al principio.
 

Ej: Buscamos  la palabra "Mundo" SOLO al final de la cadena ($).

$cadena="Hola Mundo";

if ($cadena =~  /$Mundo/)
    {
    print "Existe";
   }

# Se traduce como Si  "Hola Mundo" contiene "Mundo" al final.
 

Una combinación de SOLO ambos metacaracteres ^$ significa línea en blanco.

$cadena="Hola Mundo";

if ($cadena =~  /^$/)
    {
    print ";
   }

# Podríamos traducirlo como Si  "Hola Mundo" contiene ninguna palabra.
 

Ej: Buscamos una palabra que empieza por  "M"  (*).

$cadena="Hola Mundo";

if ($cadena =~  /M*/)
  {
    print "Existe";
   }

# Traducido como Si  "Hola Mundo" contiene una palabra que empieza por "M".

Otra variante sería con el metacaracter +.

$cadena="Hola Mundo";

if ($cadena =~  /M+/)
    {
    print "Existe";
   }
 

# Traducido como Si  "Hola Mundo" contiene una palabra que empieza por "M".
 

Ej: Buscamos cualquier caracter (? o .) en una cadena.

$cadena="Hola Mundo";                                     #

if ($cadena =~  /M?ndo/)
  {
   print "Existe";
  }

# Si  "Hola Mundo" contiene palabras como "Mundo","Mendo",Mondo", etc....
 

Ej: Buscar una cadena dentro de otra o sola; usando \b y \B

$cadena="El oso es perezoso";

if ($cadena =~  /\boso/)
  {
   print "Palabra suelta: oso";
  }

if ($cadena =~  /\Boso/)
  {
   print "Forma parte de una palabra: perezoso ";
  }
 

# Si  "El oso perezoso" contiene la cadena "oso" como palabra suelta o formando otra palabra.
 

Ej: Podemos hacer una busqueda doble o alternativa ( | ), es decir, buscar una cadena u otra.

$cadena="El oso y el tigre están durmiendo";

if ($cadena =~  /oso|tigre/)
  {
   print "Existen";
  }

# Si  "El oso y el tigre están durmiendo" contiene la cadena "oso" o "tigre".

Ej: En ocasiones es preferible usar una variable implícita  $_  para realizar las busquedas, de este modo no es necesario incluir la variable en la comparación.

$_="Hola Mundo";

if ( /Hola/)
  {
   print "Existe";
  }

# Si  "Hola Mundo" contiene la cadena "Hola". Como observamos en la comparación SOLO se incluye la expresión regular.
 
 

Hay otras combinaciones de caracteres que actúan como patrones. Se colocan entre corchetes.

[qjk]            # Las letras  q o j o k
[^qjk]          # Ni q ni j ni k. En estos casos el signo al principio indica NO.
[a-z]            # Cualquier caracter desde a hasta z inclusive y en minúscula.
[^a-z]          # Ninguna letra en minúscula.
[a-zA-Z]      # Cualquier letra mayúscula o minúscula.
 

Recordemos los modificadores y caracteres de control que empiezan por "\".

 "\n"    Nueva línea.
  "\t"    Tabulacíon.
  "\s"    Espacio.
  "\S"   No espacio.
  "\r"    Retorno de carro.
  "\f"    Nueva hoja (formfeed).
  "\e"   Secuencia de ESCape.
  "\u"   Pasa a mayúscula el primer caracter de texto siguiente".
  "\U"   Pasa a mayúscula todo el texto siguiente".
  "\l"    Pasa a minúscula el primer caracter de texto siguiente".
  "\L"   Pasa a minúscula todo el texto siguiente.
  "\E"   Fin del efecto de los modificadores \U,\L.
  "\a"    Emite un pitido.
  "\cC"  Combinación de Control+Letra. En este caso Control-C .
  xN   el signo por (x) seguido de un número N repite un caracter o texto anterior N veces.

SUSTITUCIONES EN EXPRESIONES REGULARES

    Hasta ahora hemos usado las expresiones regulares SOLO para realizar busquedas, pero también se pueden usar para realizar sustituciones de cadenas. En las sustituciones anteponemos a los delimitadores de expresión regular "/../" la letra "s" de sustitución. Ej: s/Hola/Adiós/. Sustituimos la palabra "Hola" por "Adiós".Usando la variable implícita $_ realizamos sustituciones rápidas.

$_="Hola Mundo";

s /Hola/Adiós/;
print $_;

# Cambiamos en "Hola Mundo" la cadena "Hola" por "Adiós". La variable implícita $_ contendría "Adiós Mundo".

Reemplazamos todas las "o" por "a".

$_="Hola Mundo";

s /[o]/a/g;
print $_;

# Cambiamos en "Hola Mundo" todas las "o" por "a". La variable implícita $_ contendría "Adias Munda".
# En este caso incluimos otro modificador que es "g" que significa, globalmente.
 

Reemplazamos todas los espacios entre palabras por un guión "-".

$_="Hola Mundo";

s /\s/-/g;
print $_;

# Cambiamos en "Hola Mundo" todas los espacios por un guión "-". Quedaría así: "Hola Mundo".

Otros modificadores son:

   i .-   No tiene en cuenta mayúsculas y minúsculas.

$_="Oh, Hola Mundo";

s /o/a/gi;
print $_;

# Cambiamos en "Oh, Hola Mundo" todas las "o" por "a", incluso la que está en mayúscula.
# La variable implícita $_ contendría "ah, Hala Munda".

 Existen una gran cantidad de posibilidades de patrones y modificadores por lo que no se pueden incluir en este tutor por su extensión. En el libro Programando PERL de la editorial O'Reilly, así como en otros se pueden encontrar muchos ejemplos.

FUNCIONES APLICADAS A EXPRESIONES REGULARES
 
    Además de las expresiones regulares y los distintos patrones de busqueda, PERL incluye una serie de funciones especiales para el tratamiento de cadena.

SPLIT. Esta función se basa en la división o troceado de una cadena en distintos campos, usando como delimitador un caracter dado y que formará parte de una expresión regular de busqueda. La función devuelve una matriz o array con los distintos campos obtenidos.

Ej: Disponemos de un registro de  personas, delimitados por el signo de 2 puntos ":". La función SPLIT nos va a dar el registro divido en campos, usando como patrón de busqueda el delimitador de los campos, es decir, los 2 puntos ":".
 

$usuarios="Juan:Pedro José:Carlos:José María";
@personas=split(/:/,$usuarios);
foreach $nombre (@personas)
{
 print "$nombre\n";
}
 

Si no se quiere cargar en la matriz obtenida del "troceado" de la cadena, los campos nulos, o sea, aquellos que están en blanco entre 2 delimitadores Ej: "Juan::Pedro:María". Usaremos esto: split(/:+/,$usuarios).
 

JOIN. Esta función es contraria a la anterior y consigue componer un registro con distintos campos, usando como delimitador de cada campo un caracter dado. La función devuelve una cadena con campos delimitados.
 

@personas=("Juan","Pedro José","Carlos","José María");
@registro=join(":",@personas);

foreach $cadena (@registro)
{
 print "$cadena";
}
 
 
 
 


 
Página anterior
Inicio de página
Página siguiente