2010-02-22 14 views
1

Si j'ai une variable, $bar, qui est égale à la chaîne "foo" et $foo est égal à 0xdead, comment puis-je obtenir la valeur $foo alors que j'ai seulement la chaîne pour le nom de la variable? Essentiellement, je veux faire une sorte d'indirection de pointeur sur l'espace de nom global ou une recherche de hachage sur l'espace de noms global.Comment puis-je utiliser la valeur d'une variable comme nom de variable en Perl?

Ce qui suit ne fonctionne pas:

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

Il imprime seulement la nouvelle ligne.

+1

Avant de poursuivre, assurez-vous d'avoir lu tout ceci: http://perl.plover.com/varvarname.html. – FMc

+1

Voir aussi http://stackoverflow.com/questions/1549685/how-can-i-use-a-variable-as-a-variable-name-in-perl/1549695#1549695 ... Oh, et, * * vous ne devriez pas vouloir faire ceci. ** –

Répondre

7

Cette astuce fonctionne uniquement avec les variables globales (les références symboliques recherchent le symbol table du package en cours), i. e.

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

Si vous voulez attraper lexicales, vous devrez utiliser eval ""

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

Mais en utilisant eval "" sans fin est considéré comme mauvais style en Perl, ainsi que l'utilisation des variables globales. Envisagez d'utiliser des références réelles (si vous le pouvez).

4

Il y a très très très peu de précieuses instances dans Perl où vous devez utiliser des références symboliques. Éviter les références symboliques dans tous les autres cas ne concerne pas le style. Il s'agit d'être un programmeur intelligent. Comme mjd explique en Why it's stupid to "use a variable as a variable name":

La racine réelle du code de problème est la suivante: Il est fragile. Vous vous mêlez contrairement aux choses quand vous faites cela. Et si deux de ces choses différentes ont le même nom, elles entreront en collision et vous obtiendrez la mauvaise réponse. Vous avez donc une longue liste de noms qu'il faut faire attention de ne pas réutiliser, et si vous bousiller, vous obtenez une erreur très bizarre. C'est précisément le problème que les espaces de noms ont été inventés pour résoudre, et c'est juste ce qu'est un hachage: Un espace de noms portable.

Voir également Part 2 et Part 3.

+0

Mon but est d'itérer sur un tas de variables, et si l'une des variables est définie à une certaine valeur, je veux signaler ce nom de variable. J'ai donc besoin de la valeur variable et du nom de la variable. –

+3

@Ross Rogers Ces variables sont-elles liées? Probablement. Ensuite, ** utilisez un hachage **. C'est ce que la table de symboles est: Un hachage. –

+0

J'interface avec un ancien analyseur d'options personnalisé qui stocke ses valeurs dans l'espace de noms global. Si j'avais mon chemin, nous n'utiliserions pas notre propre analyseur d'options, mais utiliserions parseopts à la place. –

Questions connexes