Como posso usar o valor de uma variável como um nome de variável em Perl?
-
22-09-2019 - |
Pergunta
Se eu tiver uma variável, $bar
, é igual à string "foo"
e $foo
é igual a 0xdead
, como posso obter $foo
's valor enquanto eu só tenho a seqüência de caracteres para o nome da variável?
Essencialmente, eu quero fazer uma espécie de ponteiro indireto no espaço de nomes global ou um hash de pesquisa sobre o espaço de nomes global.
A seguir não funciona:
perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
Ele imprime apenas a quebra de linha.
Solução
Este truque só funciona com variáveis globais (referências simbólicas buscar a tabela de símbolos o pacote atual), eu.e.
perl -e '$foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
Se você quiser pegar lexicals, você terá que usar eval ""
perl -e 'my $foo=0xdead; my $bar ="foo"; print eval("\$$bar"),"\n";'
Mas usando eval ""
sem propósito é considerado de mau estilo Perl, bem como o uso de variáveis globais.Considere o uso de referências reais (se possível).
Outras dicas
Existem muito muito poucas instâncias em Perl, onde você deve usar referências simbólicas. Evitar referências simbólicas em todos os outros casos não é sobre estilo. Trata -se de ser um programador inteligente. Como mjd explica em Por que é estúpido "usar uma variável como um nome de variável":
A verdadeira raiz do código do problema é: é frágil. Você está se misturando ao contrário das coisas quando faz isso. E se dois deles, ao contrário das coisas, terem o mesmo nome, eles colidirão e você receberá a resposta errada. Então, você acaba tendo uma longa lista de nomes que você deve ter cuidado para não reutilizar e, se você estragar tudo, receberá um erro muito bizarro. Este é precisamente o problema de que os namespaces foram inventados para resolver, e é exatamente isso que é um hash: um espaço de nome portátil.
Sem my
e com $$bar
funciona para mim:
$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";' 57005
Você pode descobrir mais sobre usar uma variável como um nome variável no Lista de perguntas frequentes do Perl.