Yo lo reproduje también con una regex mínima (de un sólo caracter, yo usé À
que es si mal no recuerdo \303\200), teniendo todo en utf8... no comprendo
de todas maneras mirando el source del método hash qué es lo que se modifica
si lo calcula en base a options (que no se modifica) y "str", que al parecer
tampoco (pero no sé bien cómo constatarlo, cómo acceder al miembro str de
una regex sin caer en una extensión C para Ruby)...

A grandes rasgos no veo mal el monkey patch que propuso Aureliano (aunque no
me deja muy tranquilo).

Preguntonta: ¿no podés evitar utilizar una Regexp como key en un Hash,
Aureliano?. Si bien Regexp cumple la restricción mínima, que es que (a.eql?(b))
==> (a.hash == b.hash), modifica el hash cuando le da la gana (eso no está
prohibido pero es un warning, que necesita de un rehash[1]). De última
rehasheá tu Hash constantemente...

nachokb

[1] http://apidock.com/ruby/Hash/rehash

2009/7/9 Pablo Herrero <[email protected]>

> El 8 de julio de 2009 17:23, Aureliano
> Calvo<[email protected]> escribió:
> >>> Fíjense que cambia el hash de r1 después de matchear y también deja de
> >>> ser cierto r1.eql? r2.
> >> Hola!
> >>
> >> Probé un poco las expresiones y vi que el error se produce cuando en
> >> la expresión incluis esta parte \303[\200-\277]
> >> pero no entiendo para qué la usás por lo que pude avanzar mucho
> >>
> >> si te confirmo que :
> >> r1 = /([A-Za-z0-9])*(_([A-Za-z0-9])+)+/
> >> r2 = /([A-Za-z0-9])*(_([A-Za-z0-9])+)+/
> >> o
> >> r1 =
> /([A-Za-z0-9]|\\303[\\200-\\277])*(_([A-Za-z0-9]|\\303[\\200-\\277])+)+/
> >> r2 =
> /([A-Za-z0-9]|\\303[\\200-\\277])*(_([A-Za-z0-9]|\\303[\\200-\\277])+)+/
> >>
> >>
> >> no 'machean' "hola" y la comparacion r1.eql?(r2) es verdadero
> >>
> >> 'machean' "hola_mundo" y la comparacion r1.eql?(r2) es verdadero
> >>
> >>
> >> si poestas una cadena que 'machee' con \303[\200-\277] puedo probar un
> poco mas.
> >
>
> En realidad tenés esta situación con cualquier expresión que contenga
> algún caracter de valor ascii de 128 (\200) a 255 (\377), es decir q
> estan fuera del ansii de 7 bits. Y el error ocurre tanto cuando tu
> expresion matchea como cuando no.
>
> Esto sólo falla:
>
> r1 = /\200/
> r2 = /\200/
> r1 =~ "cualquier string"
>
> r1 == r2 # devuelve false
>
> El tema debe ser que estas utilizando algun encoding (ISO 8859-1 por
> ejemplo), que la libreria built-in de regex no soporta y esta queda en
> estado erroneo despues de hacer el matcheo.
> Una solucion, si tenes ganas de tomarte el trabajo de hacer, es pasar
> tus strings a utf-8, y decirle a r1, q use unicode cuando la creas,
> (claro q tambien tendrias q reescribir tus expresiones regurales para
> q usen los caracteres unicode).
>
> Por elemplo, esto en mi maquina funciona (por cierto q mi enconding
> por defecto es utf-8):
>
> r1 = /á/u
> r2 = /á/u
> r1 =~ "asd  á asd "
>
> r1 == r2 # devuelve true
> r1.hash == r2.hash # devuelve true
>
> Tendrias q ver vos, si vale la pena pasar todos tus strings a utf-8
> (con Iconv por ejemplo), antes de probarlos contra tus expresiones.
>
> Saludos.
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a