Re: Expresiones regulares en perl

2009-05-27 Thread Pablo Jiménez
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 =~ /((.|\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>/m)

Indícanos si tienes alguna novedad.

Saludos.

-- 
Pablo Jiménez


--
To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Re: Expresiones regulares en perl

2009-05-27 Thread Javier
El día 27 de mayo de 2009 18:06, Pablo Jiménez  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 =~ /((.|\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>/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.


--
To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Re: Expresiones regulares en perl

2009-05-28 Thread Javier
El día 28 de mayo de 2009 0:27, Javier  escribió:
> El día 27 de mayo de 2009 18:06, Pablo Jiménez  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 =~ /((.|\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>/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, ,
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 =~ /((.|\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.


--
To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Re: Expresiones regulares en perl

2009-05-28 Thread José Luis Triviño

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, ,
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 =~ /((.|\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

/((.|\n)*)/


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í:

/\((.|\n)*)\/


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,



--
To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Re: Expresiones regulares en perl

2009-05-28 Thread Javier
El día 28 de mayo de 2009 14:38, José Luis Triviño
 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, ,
>> 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 =~ /((.|\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
>
> /((.|\n)*)/
>
>
> 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í:
>
> /\((.|\n)*)\/
>
>
> 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 =~ /((.|\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.


--
To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Re: Expresiones regulares en perl

2009-05-28 Thread Angel Claudio Alvarez
El jue, 28-05-2009 a las 12:41 +0200, Javier escribió:
> El día 28 de mayo de 2009 0:27, Javier  escribió:
> > El día 27 de mayo de 2009 18:06, Pablo Jiménez  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 =~ /((.|\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>/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, ,
> 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 =~ /((.|\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.
> 
> 


-- 
To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org