Question

Si j'ai une variable, $bar, qui est égale à la chaîne "foo" et $foo est égale à 0xdead, comment puis-je obtenir la valeur de $foo alors que je ne la la chaîne pour le nom de la variable?

Pour l'essentiel, je veux faire une sorte de pointeur indirection sur l'espace de noms global ou une recherche de hachage sur l'espace de noms global.

Ce qui suit ne fonctionne pas:

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

Il imprime uniquement la nouvelle ligne.

Était-ce utile?

La solution

Cette astuce ne fonctionne qu'avec des variables globales (références symboliques cherchent la table des symboles de l'emballage 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. Pensez à utiliser des références réelles (si vous le pouvez).

Autres conseils

Il y a très très très précieusement quelques cas Perl où vous devez utiliser des références symboliques. Éviter les références symboliques dans tous les autres cas ne sont pas sur le style. Il est d'être un programmeur intelligent. Comme MJD explique dans Pourquoi il est stupide de "utiliser une variable comme nom de variable" :

  

La racine réelle du code de problème est le suivant: Il est fragile. Vous êtes à la différence des choses quand se mêler vous faites cela. Et si deux personnes à la différence des choses qui arrivent à avoir le même nom, ils entrent en collision et vous aurez la mauvaise réponse. Donc, vous finissez par avoir une longue liste de noms que vous devez veiller à ne pas réutiliser, et si vous bousiller, vous obtenez une erreur très bizarre. Ceci est précisément le problème que les espaces de noms ont été inventés pour résoudre, et qui est juste ce qu'un hachage est: Un espace de noms portable.

Voir aussi Partie 2 et Partie 3 .

Sans my et $$bar fonctionne pour moi:

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

Vous pouvez en savoir plus sur l'utilisation une variable comme nom de variable dans le Perl FAQ Liste .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top