[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 14:38, José Luis Triviño
<trivino@lcc.uma.es> escribió:
> Javier wrote:
>>
>> 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?
>>
>>
>
> Hola,
>
> Corrígeme si me equivoco. Pero la expresión regular no debería ser
>
> /<temas>((.|\n)*)</temas>/
>
>
> El / separador no debería estar escapado \/ Quizás en cambio si deberías
> escapar los paréntesis angulares
> y dejar la expresión así:
>
> /\<temas\>((.|\n)*)\</temas\>/
>
>
> Además! El ? Creo que es redundante y se podría eliminar. Pruebala de esta
> forma a ver si funciona y hace lo mismo que la otra.
>
> Saludos,
>
>
>

Hola,

yo creo que la expresión sí está bien construida, por lo menos para lo
que necesito. Podría sacarle el ?, que sí es redundante, pero por el
resto, sí funciona. El <\/temas> está escapado para que no entienda
que es ese el fin de la expresión regular.
Creo que está bien por que con variables de tamaño pequeño sí lo hace
correctamente. El problema está cuando las variables son de gran
tamaño.

Probé a poner un else en el if y resulta que se va por el else..., por
lo tanto entiendo que la expresión regular está a fallar o no se puede
ejecutar. No es que no devuelva un valor, sino que falla en sí, por el
tamaño de la variable, en este caso, por que se va por el else.

if ($ref =~ /<temas>((.|\n)*)<\/temas>/m)
{
        print $1;
}
else
{
        print "fail!\n";
}

Siempre va por el else con un tamaño de variable/fichero grande.

-- 
A greeting,
Javier.


Reply to: