Perl - Subexpresiones ???

 
Vista:

Subexpresiones ???

Publicado por luis (2 intervenciones) el 06/08/2005 23:28:40
Hola, soy un absoluto novato en esto de la programación en PERL... Hace más o menos un mes que estoy luchando para aprender este lenguaje utilizando un libro llamado "Creación de Paginas Web con Perl". El libro es, además de viejo (1996) muy malo (al menos, mal traducido)...

Muchas de las cosas que se describen en el libro no funcionan como dice que debieran... Una de esas cosas es lo que se describe como "Subexpresiones" en expresiones de búsqueda. Según el libro, uno establece un modelo que, al encontrarse una vez en una línea, lo busca a ver si está una segunda vez (o las que haga falta). El ejemplo es algo así:

/([A-Z][A-Z]).*$1/;

... donde lo que está entre paréntesis representa 2 mayúsculas cualquiera, y el $1 una potencial segunda coincidencia... Se entiende? Entonces, al buscar este modelo, coinciden lineas como:

Chicago, IL, Cairo, IL, 375
Cincinatti, OH, Cleveland, OH, 244

pero no:

Cleveland, OH, Dallas, TX, 1159

Sin embargo, no he logrado hacer funcionar esto ni una sola vez. En fin, si lo que estoy escribiendo suena ridículo o demasiado ignorante, bueno, sepan entender. Con la mala traducción puedo luchar un poco, pero esto me sobrepasa un poco... Si alguien aquí me pudiera aclarar que estoy haciendo mal (o que dice mal el maldito libro), estaría muy agradecido, y realmente recobraría un poco de voluntad para aprender este lenguaje, que me resulta bastante interesante (soy diseñador de páginas web, y la idea de poder hacer mis propios scripts me atrae).

Mil gracias desde ya!

Luis.

Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:Subexpresiones ???

Publicado por Martin Moya Hernandez (20 intervenciones) el 09/08/2005 16:57:33
El concepto subexpresiones esta mal utilizado, en realidad la utilizacion de expresiones regulares es una de las funciones mas robustas que tiene desarrollado perl, como ejemplo, estas realizando la busqueda de patrones dentro de una linea de texto cualquiera, en donde un patron (de eso se trata) es continuo y contiguo y unicamente quieres sacar cierta informacion de la linea, tomando tu ejemplo.

/([A-Z][A-Z]).*$1/;

Esta puede decirse que es una consulta anticipadada y trabaja de la siguiente manera.

Compara el primer caracter de la linea y determina que este en el rango A-Z en MAYUSCULAS determina si el SEGUNDO caracter esta en el rango A-Z en MAYUSCULAS seguido de cualquier caracter (menos el salto de linea) seguido de cualquier cosa CERO O MAS VECES, el $1 toma el valor de esta misma consulta PERO SOLO UNA VEZ.

Si entendi bien necesitarias el codigo de tu expresion regular de la siguiente manera.

/(\w+){1,8}/;

Describiendolo mejor, esto quiere decir que va a realizar una busqueda de un CARACTER ALFABETICO UNA O MAS VECES hasta que encuentre un separador de palabra (blanco, guion, o cualquier caracter que no sea alfabetico), la cantidad de veces que puede realizar esta busqueda {} es de al menos una vez y como maximo de ocho.

Espero que esta pequeñisima explicacion te sea de utilidad.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Subexpresiones ???

Publicado por Luis (2 intervenciones) el 09/08/2005 17:20:49
Antes que nada, gracias por la respuesta!

El modelo /(\w+){1,8}/; que me describes arriba lo comprendo, esa parte (de lo que vengo leyendo hasta ahora) la entiendo. Lo que yo pretendo comprender es lo que este libro me explica, que tal vez no detallé bien en el mensaje anterior... Según el libro, hay una manera de buscar lineas en la que coinciden solo las que tienen un modelo específico una determinada cantidad de veces (mas de una, desde ya) y en cualquier lugar de la linea. Por ejemplo,

"PABLITO clavó un clavito, que clavo clavó PABLITO"
"PABLITO come arroz con queso"
"- ¡PABLITO es mi nombre! - Dijo PABLITO"
"PABLITO es un haragán"

(A estas alturas debés estar pensando que soy un papanatas)

Mi intención sería hacer una búsqueda usando un modelo que certifique que la palabra PABLITO se encuentra al menos 2 veces en las lineas que revisa, de forma que, en el caso anterior, solo coincidan la primera y la tercera linea, más no la segunda o la cuarta... Se entiende?

Lo que yo entiendo según el maldito libro, es que el modelo que yo necesitaría para buscar eso sería:

/(PABLITO).*$1/;

Pero no funciona =(

Bueno, otra vez, mil gracias por la ayuda que me puedan dar, y les juro que estoy tratando de entender...

Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Subexpresiones ???

Publicado por Joaquin Ferrero (2 intervenciones) el 13/08/2005 19:45:50
perl -nle 'print if /(PABLITO).*\1/;' kk.txt
"PABLITO clavó un clavito, que clavo clavó PABLITO"
"- ¡PABLITO es mi nombre! - Dijo PABLITO"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar