¿Cómo obtener el nombre de una varia ble?

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

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

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