Comment puis-je utiliser la valeur d'une variable comme nom de variable en Perl?
-
22-09-2019 - |
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.
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.
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 .