¿Cómo puedo utilizar el valor de una variable como un nombre de variable en Perl?

StackOverflow https://stackoverflow.com/questions/2314507

  •  22-09-2019
  •  | 
  •  

Pregunta

Si tengo una variable, $bar, que es igual a "foo" cuerda y $foo es igual a 0xdead, ¿cómo puedo obtener el valor de $foo mientras que sólo tengo el de la cadena para el nombre de la variable?

En esencia, lo que quiero hacer una especie de indirección puntero en el espacio de nombres global o una búsqueda de hash en el espacio de nombres global.

La siguiente no funcionó:

perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

Sólo se imprime el carácter de nueva línea.

¿Fue útil?

Solución

Este truco sólo funciona con variables globales (referencias simbólicas buscan la tabla de símbolos del paquete actual), i. mi.

perl -e '$foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

Si desea lexicals de captura, que tendrá que utilizar eval ""

perl -e 'my $foo=0xdead; my $bar ="foo"; print eval("\$$bar"),"\n";' 

Pero el uso de eval "" sin fin se considera mal estilo en Perl, así como el uso de variables globales. Considere el uso de referencias reales (si es posible).

Otros consejos

Hay muy muy muy preciosamente pocos casos en Perl en el que debe utilizar referencias simbólicas. Evitando referencias simbólicas en todos los demás casos no se trata de estilo. Se trata de ser un programador inteligente. Como mjd explica en ¿Por qué es estúpido "usar una variable como nombre de variable" :

  

La verdadera raíz del problema es el código: Es frágil. Eres mezcla a diferencia de las cosas cuando se hace esto. Y si dos de esas cosas a diferencia de pasar a tener el mismo nombre, que van a chocar y obtendrá la respuesta equivocada. Así que al final tener toda una larga lista de nombres que hay que ser cuidadosos a la reutilización, y si metes la pata, se obtiene un error muy extraño. Este es precisamente el problema que se inventaron los espacios de nombres para resolver, y eso es justo lo que un hash es: Un espacio de nombres portátil.

Consulte también Parte 2 y Parte 3 .

Sin my y con $$bar funciona para mí:

$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";'
57005

Se puede encontrar más información sobre el uso de una variable como un nombre de variable en la href="http://perldoc.perl.org/perlfaq.html" rel="nofollow noreferrer"> Perl FAQ Lista .

scroll top