
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".
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 Mundo" contiene "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 Mundo" no 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";
}
|
|