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

Re: Expresiones regulares en perl



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?

-- 
Un saludo,
Javier.


Reply to: