[Perl] Expresiones regulares y cuantificadores no codiciosos

Hace poco tiempo tuve problemas con una regex que no tomaba lo que, al parecer, yo le indicaba. El problema no es grave, pero tiene que ver sobre como Perl trata las expresiones regulares y las wildcards.

Por ejemplo, si tenes el siguiente string “See spot, see spot run, run spot run” y tratamos de capturar lo que se encuentra antes del primer ‘spot’ podríamos querer hacer algo como esto:

Lo cual nos mostraría en pantalla ‘See spot, See spot run, run ‘. En vez del primer ‘See ‘ que ya cumpliría con lo que dice nuestra regex. El tema está en que Perl, tratara de matchear lo más que pueda ya que hace uso de cuantificadores codiciosos (greedy quantifiers). De modo que para traer el primer ‘See ‘ debemos hacer uso de los ‘cuantificadores no codiciosos’ (non-greedy quantifiers), En este caso ‘*?’  que tratara de matchear 0 o más lo menos que pueda. Es decir, cambiando a:

Obtendremos el primer ‘See ‘.

Del mismo modo, asì como con el cuantificador codicioso ‘+’ matchearemos 1 o 0 veces, con ‘+?’ matchearemos 0 o 1 veces (primero 0, luego una). y usando el cuantificador no codicioso  {x,y}? podremos matchear x veces, pero no màs de y.

Conclusión, un problema bastante sencillo pero que puede generar algunas confusiones.

Fuente:  http://perldoc.perl.org/perlretut.html

Importando datos SQL con Perl

Hace algun tiempo tenia que importar CSV a una tabla que tenia guardada en una base de datos Postgre para una materia de la escuela.

Como tenia un problema con la forma oficial para hacer esto y no funcionaba internet, con la ayuda de Perl arme un pequeño script que, leyendo desde un archivo CSV, generaba sentencias “insert” con los datos para luego pegarlos en una consola y de esa forma tener mís datos importados… como quien dice, una “rebuscada freak”

En fin, el código pueden verlo a continuación o bien desde mí cuenta de gitHub en: https://github.com/tehsis/importSQL

EDIT: Debido a que el script fue sufriendo algunos cambios desde que lo publique, dejo solo el link al repo

Presentando a El Goblin

Desde hace un par de semanas, comence a aprender Perl y para esto inicie un pequeño proyecto sobre un buscador de páginas web, sin más intenciones que obtener sitios y buscarlos mediante tags y principalmente, aprender a trabajar con Perl y otras herramientas.
Así fue que nacio “The Goblin Search Engine”. Una serie de scripts que permitian añadir sitios a una base de datos  (MongoDB) y luego buscarlos mediante los tags  (los cuales son obtenidos del sitio).

Habiendo avanzado ya un poco, me dispuse a darle un objetivo más “práctico” a este buscador para que no muera solamente en un puñado de código mal armado y es así como nace Goblin como proyecto personal.

¿En que consiste?

Actualmente, esta dividido en dos partes. “The Goblin server” y “The Goblin client”, conectados el uno con el otro mediante SOAP.
El primero, como ya dije, esta hecho completamente en Perl y es el encargado de agregar los sitios a la base de datos, realizar las busquedas y brindarle los resultados al cliente.
El segundo (el cliente) no es más que una API para poder acceder a los servicios del servidor (valga la redundancia).
Tambien junto con el cliente se incluye un script como ejemplo para usarlo.

¿Y el objetivo?

El objetivo sigue siendo aprender. Las ideas que tengo para implementar en Goblin son muchas y seguramente apareceran más sobre la marcha.
De momento, es solamente un pseudo buscador de páginas web indexadas en una BD que no esta pensado bajo ningun punto de vista para usarlo en producción (aunque bien podría servir como base).
Sin dudas, el siguiente paso sera hacerlo más robusto, actualmente es bastante inestable y “facil de romper”  ademas, claro, que carece de muchas caracteristicas que podrian considerarse un “must” en este tipo de apps. Vamos, que hay que mejorarle TODO.

En conclusión. La idea de este post era solamente comentar sobre Goblin. No recomiendo su uso actualmente, pero el código esta ahí listo para que lo bajen y hagan lo que quieran con el (bueno, siempre que la GPLv3 lo permita ;) )

Por último, quiero agradecer a @guitarrear por impulsarme a aprender Perl y por consiguiente, a comenzar ese humilde proyecto :)

http://github.com/tehsis/Goblin