[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Expresiones regulares en perl



El jue, 28-05-2009 a las 12:41 +0200, Javier escribió:
> El día 28 de mayo de 2009 0:27, Javier <correolista@gmail.com> escribió:
> > El día 27 de mayo de 2009 18:06, Pablo Jiménez <pejimene@vtr.net> escribió:
> >> On Wed, May 27, 2009 at 05:02:06PM +0200, Javier wrote:
> >>> Hola,
> >>>
> >>> acabo de actualizar un equipo de etch a lenny y la versión de perl
> >>> ascendió de la 5.8 a la 5.10.
> >>> El problema me viene ahora en cómo lenny trata las expresiones
> >>> regulares, pues parece que no es de la misma forma. Tengo un programa
> >>> chorra que lee de un fichero, lo almacena en una variable y luego a
> >>> esa variable se le hace una expresión regular. Con la nueva versión de
> >>> perl, dicho código falla siempre que el archivo leído ocupe más de 30
> >>> Kb's. Si ocupa menos la expresión regular va perfectamente.
> >>> Comprobando el fichero sí lo almacena correctamente en la variable,
> >>> por lo que el fallo está a nivel del if, pero no se que es lo que pudo
> >>> cambiar en perl 5.10
> >>>
> >>> Posteo el código:
> >>> -----------------------------------------------------
> >>> #!/usr/bin/perl
> >>>
> >>> use XML::Simpler;
> >>>
> >>> my $ref=XMLin("t.xml");
> >>> if ($ref =~ /<temas>((.|\n)*?)<\/temas>/)
> >>> {
> >>>         print "Resultado: $1";
> >>> }
> >>>
> >>> -----------------------------------------------------
> >>>
> >>> ¿Alguna idea de por qué el fallo?
> >>
> >> Tal vez se deba a que intentas hacer un matching para un string compuesto
> >> de múltiples líneas, pero no has indicado el flag m. Prueba cambiando tu if
> >> por:
> >>
> >> if ($ref =~ /<temas>(.*?)<\/temas>/m)
> >>
> >> Indícanos si tienes alguna novedad.
> >>
> >> Saludos.
> >>
> >> --
> >> Pablo Jiménez
> >>
> >
> > Hola,
> >
> > sí probé con el match m para realizar el grep y aún así me daba el mismo error.
> > Creo que puede ser algo de las versiones de perl 5.8 contra 5.10, pero
> > no se lo qué :(
> > Quizás algo estilo tamaño máximo de un grep en memoria o algo así. En
> > equipos con etch va perfectamente y al actualizarlos a Lenny ya no. Lo
> > único que cambia para la expresión regular es la versión.
> >
> >
> > --
> > Un saludo,
> > Javier.
> >
> 
> Hola,
> 
> haciendo más pruebas he descubierto que el problema debe de estar en
> la evaluación de la expresión regular esa en concreto o del tamaño de
> la misma.
> Si con los mismos valores de entrada (ficheros de más de 30 Kb's)
> escribo una expresión en perl que borre, por ejemplo, <temas>,
> devuelve un valor correcto al sistema. Si luego hago un print, se ve
> que funciona perfectamente. Sin embargo con la expresión que está
> ahora "if ($ref =~ /<temas>((.|\n)*?)<\/temas>/){}" siempre falla si
> el tamaño de la variable es muy grande.
> 
> ¿Alguna idea de por qué puede pasar eso tras la actualización a lenny?
> 

Proba parsear sin utilizar XML, es decir proba con un archivo de texto
comun, leyendo linea a linea, para ver si te da ese mismo error. Podes
hacerlo con ese mismo archivo

> -- 
> Un saludo,
> Javier.
> 
> 


Reply to: