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:
- 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:
- 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.
- 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.
- 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:
- 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;
}
- 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
}
- 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.
- 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_X7Cuando 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; printla salida por pantalla sería la siguiente: 1X_X4X_XX_X4X_X
- 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]/;
- 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}/
- 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
- 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 burritoXXXLos siguientes caracteres tienen un significado paralelo al anterior por lo que no se darán ejemplos de ellos:
- Carácter: \w . Expresa un carácter alfanumérico.
- Carácter: \b . Expresa un espacio en blanco.
- Carácter: \t . Significa un tabulador.
- Carácter: \r . Expresa un retorno de carro.
- Carácter: \n . Significa un final de línea.
- 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:
- 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: EOflyingburritoXXComo 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.
- 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.
- 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:
- 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
- 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.