Hola, igual es una tonterÃa pero no encuentro forma. Simplemente quiero
poder
acceder al propio nombre de una variable.
O sea, supongamos que:
var1 = “ASDSASDDSDSD”
¿Qué método he de usar para obtener “var1” a partir de var1?
var1.XXXXX = “var1” ==> ¿XXXXX?
On Mar 12, 2008, at 22:35 , Iñaki Baz C. wrote:
var1.XXXXX = “var1” ==> ¿XXXXX?
No se puede.
Para que lo querias?
– fxn
El Miércoles, 12 de Marzo de 2008, Xavier N. escribió:
¿Qué método he de usar para obtener “var1” a partir de var1?
var1.XXXXX = “var1” ==> ¿XXXXX?
No se puede.
Para que lo querias?
Es por un motivo un poco “raro”. Estoy manejando código ABNF con una
utilidad
en Ruby llamada “abnf”:
abnf – converter from ABNF to Ruby Regexp
abnf - converter from ABNF to Regexp
Resulta que su método principal (el que devuelve la Regexp) escupe en la
salida estándar en vez de devolver ese valor (hace un “puts” en vez de
un “return”).
Entonces para obtener un fichero con el nombre de la variable y su
Regexp
obtenida estoy intentado una chapucilla en plan:
script.rb
def get_regexp(nombre_variable, abnf)
puts “#{nombre_variable} = <<END_OF_STRING”
pp ABNF.regexp_tree(abnf) # ← Esto escupe a la salida estándar.
puts “END_OF_STRING”
end
Ejemplo:
ALPHANUM = <<END
alphanum = ALPHA / DIGIT
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
DIGIT = %x30-39 ; 0-9
END
get_regexp(ALPHANUM.XXXXXX, ALPHANUM)
Lo ejecuto desde Bash asÃ:
~# ruby script.rb > regexps.rb
El contenido del fichero “regexps.rb” es:
ALPHANUM = <<END_OF_STRING
%r{[0-9a-z]}xi
END_OF_STRING
que a efectos prácticos es simplemente:
ALPHANUM = /[0-9a-z]/xi
Como ves me he metido en un buen jaleo… XDD
PD: Lo que intento de fondo es hacer un parseador para el protocolo SIP
cuya
definición en formato ABNF está aquÃ:
Saludos.
El Miércoles, 12 de Marzo de 2008, David P. escribió:
No tengo mucha idea, ya que soy nuevo por estos lugares, pero ¿no serÃa
mejor hacer un pipe?
Hacer un pipe… ¿dónde exactamente? ¿en vez de qué?
Saludos.
No tengo mucha idea, ya que soy nuevo por estos lugares, pero ¿no serÃa
mejor hacer un pipe?
Un saludo.
El dÃa 12/03/08, Iñaki Baz C. [email protected] escribió:
un “return”).
puts “END_OF_STRING”
END_OF_STRING
cuya
Ror-es mailing list
[email protected]
simplelogica.net
–
Atentamente,
David P. MartÃnez
On Mar 12, 2008, at 23:00 , Iñaki Baz C. wrote:
en Ruby llamada “abnf”:
obtenida estoy intentado una chapucilla en plan:
script.rb
def get_regexp(nombre_variable, abnf)
puts “#{nombre_variable} = <<END_OF_STRING”
pp ABNF.regexp_tree(abnf) # <-- Esto escupe a la salida estándar.
puts “END_OF_STRING”
Vale, creo que los ejemplos te han liado.
Ahi hay dos metodos involucrados: uno es pp de la libreria “pp”, y el
otro ABNF.regexp_tree de la libreria “abnf”.
El metodo pp imprime, y los de abnf construyen objetos de tipo Regexp
o RegexpTree::Rep sin sacar nada por stdout (que es lo normal en una
libreria).
El metodo pp se usa en la documentacion solo para que los ejemplos
echen el resultado de ABNF.regexp o ABNF.regexp_tree por consola a
modo ilustrativo.
Para obtener una regexp simplemente invoca a ABNF.regexp(abnf).
– fxn
El Miércoles, 12 de Marzo de 2008, Xavier N.
escribió:
echen el resultado de ABNF.regexp o ABNF.regexp_tree por consola a
modo ilustrativo.
Para obtener una regexp simplemente invoca a ABNF.regexp(abnf).
Joder… la de tonterías que estaba haciendo, mira que he sido cazurro…
Mil gracias, ya sabía yo que se me había olvidado revisar qué hace el
método “pp” y había pasado de él totalmente.
Cómo se ha simplificado todo ahora
Muchas gracias, sois la leche.
Buenas noches,
Si te digo la verdad, en el ejemplo que has puesto no te sigo muy
bien. Yo lo
del pipe lo digo porque si te hace un puts y tu quieres un return, lo
único
que tendrÃas que hacer es leer de la salida estándar. Que ya digo, en
ruby ni
idea de cómo se hace. Siento si me he desviado un poco del tema, porque
ya te
digo que es uqe no entiendo muy bien lo que quieres hacer.
Un saludo
On Wednesday 12 March 2008 23:11:03 Iñaki Baz C. wrote:
El Miércoles, 12 de Marzo de 2008, David P. escribió:
No tengo mucha idea, ya que soy nuevo por estos lugares, pero ¿no serÃa
mejor hacer un pipe?
Hacer un pipe… ¿dónde exactamente? ¿en vez de qué?
Saludos.
–
Atentamente
David P. MartÃnez
El Miércoles, 12 de Marzo de 2008, David P. Bue escribió:
Buenas noches,
Si te digo la verdad, en el ejemplo que has puesto no te sigo muy bien. Yo
lo del pipe lo digo porque si te hace un puts y tu quieres un return, lo
único que tendrÃas que hacer es leer de la salida estándar. Que ya digo, en
ruby ni idea de cómo se hace. Siento si me he desviado un poco del tema,
porque ya te digo que es uqe no entiendo muy bien lo que quieres hacer.
Tranquilo, en realidad estaba haciendo algo completamente innecesario
porque
no me habÃa dado cuenta del uso del método “pp” que pinta en pantalla
(hace
puts en vez de return) y por eso me habÃa inventado esas fantasÃas XD
Ya está solucionado
El Miércoles, 12 de Marzo de 2008, Iñaki Baz C.
escribió:
Mil gracias, ya sabía yo que se me había olvidado revisar qué hace el
método “pp” y había pasado de él totalmente.
Pues ahora me sale un problema bastante raro, voy al grano:
CACA = <<END
alphanum = ALPHA / DIGIT
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
DIGIT = %x30-39 ; 0-9
END
pp ABNF.regexp_tree(CACA)
=> %r{[0-9a-z]}xi <— CORRECTO
puts ABNF.regexp_tree(CACA)
=> (?i-m:[0-9a-z]) <— ¿¿¿ESTO QUE ES???
¿Hay alguna explicación lógica al, en principio, extrañísimo valor que retorna
el método “regexp_tree”?
He comprobado que ambas salidas son clases “RegexpTree::CharClass” pero
la
verdad es que la segunda no la puedo usar como expresión regular para
comparar y tal. ¿Se me escapa algo?
Muchas gracias.
Iñaki Baz C. wrote:
El Jueves, 13 de Marzo de 2008, I�aki Baz C.
escribi�:> pp ABNF.regexp_tree(CACA)
=> %r{[0-9a-z]}xi � <— CORRECTO
puts ABNF.regexp_tree(CACA)
=> (?i-m:[0-9a-z]) � �<— ���ESTO QUE ES???
Cierto, esta forma yo tampoco la conocÃa… un dÃa intentaba parsear una
regexp a string y me salia eso que ni idea… /regexp/.to_s # =>
“(?-mix:regexp)” pero jamas habia visto esa sintaxis antes.
El Jueves, 13 de Marzo de 2008, Iñaki Baz C.
escribió:> pp ABNF.regexp_tree(CACA)
=> %r{[0-9a-z]}xi <— CORRECTO
puts ABNF.regexp_tree(CACA)
=> (?i-m:[0-9a-z]) <— ¿¿¿ESTO QUE ES???
Vale, veo que la primera forma es una RegxExp normal pero a la segunda
forma
le tengo que añadir / al principio y al final, o sea:
%r{[0-9a-z]}xi
es lo mismo que.
/(?i-m:[0-9a-z])/
Reconozco que nunca había visto esta segunda forma de indicar una
expresión regular, yo conocía estas dos:
/[0-9a-z]/ix
%r{[0-9a-z]}xi
pero lo de:
/(?i-m:[0-9a-z])/
ni idea.
2008/3/13 Edgar J. Suarez [email protected]:
Cierto, esta forma yo tampoco la conocÃa… un dÃa intentaba parsear una
Lo de (?i-m:…) hace que Ruby sea “case insensitive” (la i) en la
expresión regular, y -m hace que los sÃmbolos ^ y $ no funcionen al
final y al principio de las lÃneas, solo al final y al principio del
texto entero.
La de (?-mix:…) hace que ^ y $ solo coincidan con el final y el
principio del texto (-m), case insensitive (i), y ignora los espacios
en la expresión regular (x).
URL recomendada del dÃa: http://www.regular-expressions.info
On Mar 13, 2008, at 24:21 , Iñaki Baz C. wrote:
DIGIT = %x30-39 ; 0-9
que retorna
el método “regexp_tree”?
Lo que estas viendo es la diferencia entre lo que echa pp y lo que
echa puts. Ambos imprimen, pero dado un mismo objeto por lo general
echan cosas distintas.
Si quieres un objeto de la clase Regexp has de usar el metodo
ABNF.regexp.
En cuanto a la sintaxis (?i-m:…) una expresion regular misma puede
incluir modificadores. Esto es util cuando no tienes la sintaxis del
lenguaje a mano como al poner una regexp en un fichero de
configuracion, o por ejemplo cuando quieres que el modificador afecte
solo a una parte de la regexp, puesto que no es necesario que la
abarquen. Por ejemplo en /foo(?i:bar)/ solo “bar” es case-insensitive.
– fxn
El 13/03/08, Xavier N. [email protected] escribió:
Si quieres un objeto de la clase Regexp has de usar el metodo
ABNF.regexp.
Cierto gracias, he comprobado que “pp ABNF.regexp_tree” devuelve algo en
plan:
%r{INVITE|
ACK|
OPTIONS|
BYE|
CANCEL|
REGISTER|
INFO|
PRACK|
SUBSCRIBE|
NOTIFY|
UPDATE|
MESSAGE|
REFER|
PUBLISH|
[!%'\x2a\x2b\x2d\x2e0-9A-Z_-z~]+}x
mientras que “pp ABNF.regexp” devuelve algo más normal:
/INVITE|ACK|OPTIONS|BYE|CANCEL|REGISTER|INFO|PRACK|SUBSCRIBE|NOTIFY|UPDATE|MESSAGE|REFER|PUBLISH|[!%'\x2a\x2b\x2d\x2e0-9A-Z_-z~]+/
Con “puts” delante ambos devuelven una cadena String igual:
(?-mix:INVITE|ACK|OPTIONS|BYE|CANCEL|REGISTER|INFO|PRACK|SUBSCRIBE|NOTIFY|UPDATE|MESSAGE|REFER|PUBLISH|[!%'\x2a\x2b\x2d\x2e0-9A-Z_-z~]+)
Bueno, me quedo con lo segundo, me gusta más.
En cuanto a la sintaxis (?i-m:…) una expresion regular misma puede
incluir modificadores. Esto es util cuando no tienes la sintaxis del
lenguaje a mano como al poner una regexp en un fichero de
configuracion, o por ejemplo cuando quieres que el modificador afecte
solo a una parte de la regexp, puesto que no es necesario que la
abarquen.
Por ejemplo en /foo(?i:bar)/ solo “bar” es case-insensitive.
Eso no sabÃa que se podÃa hacer, gracias.
El 13/03/08, Daniel R. Troitiño [email protected] escribió:
Lo de (?i-m:…) hace que Ruby sea “case insensitive” (la i) en la
expresión regular, y -m hace que los sÃmbolos ^ y $ no funcionen al
final y al principio de las lÃneas, solo al final y al principio del
texto entero.
La de (?-mix:…) hace que ^ y $ solo coincidan con el final y el
principio del texto (-m), case insensitive (i), y ignora los espacios
en la expresión regular (x).
No conocÃa la opción “x” ni “m”, gracias.
URL recomendada del dÃa: http://www.regular-expressions.info
Anotado