| Artículos | 01 JUN 2001

Programación en Perl (IV)

Tags: Histórico
Javier Cáceres.
En el pasado hemos repetido hasta la saciedad que, si hay algo en lo que Perl brilla con luz propia, es la gestión de cadenas de texto.
Ha llegado el momento de comprobarlo. Le invitamos a conocer el pequeño gran mundo de las expresiones regulares.

Las expresiones regulares son un pequeño mundo en sí mismas. Tanto es así que podríamos dedicarles una serie de artículos tan larga y exclusiva como pueda ser el presente curso. En esta entrega vamos realizar un pequeño monográfico sobre las expresiones regulares, también conocidas en su mínima expresión como regex, acrónimo del término anglosajón Regular expressions. Pero la información aquí contenida no sólo le va a resultar de utilidad bajo Perl; existen muchos otros entornos y aplicaciones en los que va a poder disfrutar de la versatilidad de las regex. Otros lenguajes de programación como Pyton o Java, aplicaciones como vi y emacs, herramientas como grep, sed, etc., implementan total o parcialmente soporte para alguna de las variantes de expresiones regulares. Podríamos considerar las expresiones regulares como una especie de estándar a la hora de definir patrones de texto. Definidas entre barras laterales (/ /), todo lo que queda contenido en ellas es la expresión regular en sí misma. Una secuencia de caracteres que se ajusta a algo que podríamos considerar un pequeño y optimizado lenguaje de programación, diseñado para definir conjuntos de posibles secuencias de caracteres, posibles combinaciones que forman palabras. Evaluando la expresión como si de un autómata se tratase, emplearemos expresiones regulares, en adelante ER, cuando nos estemos preguntando si el contenido de cierta variable contiene ésta y/o aquella palabra, el número de veces que se repite tal o cual patrón en la secuencia, cómo sustituir una palabra por otra, la forma de dividir cadenas de texto...

¿Cómo funcionan?
Lo primero que hay que dejar claro es que existen ciertas diferencias. Si bien vamos a encontrar ER en multitud de aplicaciones y lenguajes, no necesariamente todas las implementaciones van a ser compatibles unas con otras. A grandes rasgos, las diferencias entre unas y otras serán mínimas siempre que tratemos con ER simples. Pero aunque, como decimos, usualmente las diferencias son mínimas, tenga presente que Perl hace gala de uno de los sistemas de ER más versátiles y avanzados que existen, por lo que es posible que no encuentre en otros entornos toda la potencia que puede desarrollar en Perl.
Lo primero que hemos de preguntarnos es para qué sirven. Bien, suponiendo que contamos con una cierta variable que contiene una determinada cadena de texto, una ER nos va a servir principalmente para dilucidar, cuando lo precisemos, si tal variable contiene una palabra o texto concreto, siendo tal texto o palabra algo predefinido, algo que, de alguna forma, ha de ajustarse a un cierto patrón. Las ER son el “arte” de “programar” una serie de órdenes que definen un determinado conjunto de valores, de palabras, de cadenas de texto, que necesitamos buscar en la mencionada variable. Las posibilidades de las ER son tantas como podamos imaginar. Desde el tratamiento de ficheros de logs para analizar el comportamiento de los usuarios, hasta el tratamiento de páginas web, pasando por generación de estadísticas, scripts de administración, cambio automático de formato en ficheros de datos, y un largo etcétera.
En una búsqueda, dos son las cosas que nos pueden interesar, y esas dos son las respuestas que Perl puede ofrecer. En primer lugar, típicamente lo vital es conocer si ciertamente una variable contiene una cadena de texto concreta. Tal incertidumbre es resuelta desde la base pues, en sí mismas, las ER en Perl devuelven valores booleanos. Esto es, dada la variable $texto=”PC World es una publicación de IDG.”;, una expresión regular como: $texto=~/PC World/;, sería algo como decir: si la cadena “PC World” se encuentra dentro de la variable $texto, entonces devuelve TRUE. Nótese que el texto a buscar (ER) se encuentra entre las barras (/ /), y que el operador (=~) define el objetivo a buscar y sobre qué variable. El segundo objetivo sería, por supuesto, obtener en una forma concreta el resultado de la búsqueda, pero eso lo veremos más adelante. Aunque el primer ejemplo pueda resultarle sencillo, tenga presente que se irá complicando progresivamente. Así pues, tal vez sea un buen momento para que trate de asimilar el funcionamiento de las ER. A tal fin, le sugerimos eche un vistazo al recuadro adjunto Esquema funcional de las ER.

Expresiones regulares simples
Hemos visto muy por encima el ejemplo más simple de expresión regular. Estudiemos cómo se comporta “sobre el terreno”. Observe el Listado 1. El uso del operador =~, define que se debe buscar en el contenido de la variable $dato un texto que se asemeje a la ER /PC World/, que es, en este caso, el propio texto “PC World”. La misma búsqueda es, por sí sola, el parámetro del bloque if. En función de si el patrón se ajusta, si existe en $dato, muestra por pantalla una salida u otra. Lamentablemente, si no introducimos correctamente “PC World”, con su correspondencia de mayúsculas y minúsculas, la búsqueda será infructuosa; esto es, no se ajustará con el patrón /PC World/. Para solventar este pequeño inconveniente, pruebe a añadir una “i” justo al final de la ER: /PC World/i. De esta forma, Perl no volverá a preocuparse de esta circunstancia.
La expresión regular más simple es, obviamente, el texto plano, como en el ejemplo que acabamos de relatar. Por fortuna, las ER no se quedan ahí, disponemos de muchos otros elementos funcionales que van a disparar la versatilidad para construir patrones de texto hasta un punto casi ilimitado. A continuación pasaremos a describir, uno por uno, los recursos más comunes de las ER simples, aquellos que deberíamos manejar con mayor soltura. Recordemos que nos encontramos ante una especie de “lego”, integrando unos elementos con otros. Aunque a primera vista parezcan sencillos, nos van a permitir construir la práctica totalidad de los patrones que podamos desear componer. Igualmente, tenga siempre presente que dentro de las ER existen caracteres reservados y, si necesitamos que formen parte de la expresión tal y como se representan, hemos de utilizar el carácter de guarda “\”. Los caracteres reservados son básicamente los reflejados en la tabla 1.
Búsqueda al principio o fin. Si deseamos forzar que la búsqueda se realice exclusivamente al final de una cadena de texto dado, acompañando a la expresión regular hemos de indicar el metacarácter “$” al final. Así pues la ER /final$/ buscaría la cadena de texto “final” exclusivamente al final de la cadena de la variable dada, y devolvería FALSE si la última palabra no fuera exactamente ésa. Asimismo, también disponemos de la otra cara de la moneda. El metacarácter “^”, fuerza al intérprete a buscar el fragmento de ER que le sigue exclusivamente al principio de la variable a inspeccionar.
Rangos de caracteres. Hasta ahora, hemos visto tan sólo búsquedas de cadenas de texto estáticas, no variables. Uno de los aspectos más relevantes de las ER es que podemos crear conjuntos de cadenas válidas con una única expresión regular. El primero de los recursos para lograr este objetivo es la de

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información