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.

Foi útil?

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.

Veja também Parte 2 e Parte 3.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top