如何在Perl中将变量的值用作变量名?

时间:2010-02-22 21:51:09

标签: perl symbolic-references

如果我有一个变量$bar,它等于字符串"foo"$foo等于0xdead,我怎样才能获得$foo' s值,而我只有变量名的字符串?

本质上,我想在全局命名空间上执行一种指针间接寻址,或者在全局命名空间上执行哈希查找。

以下不起作用:

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

它只打印换行符。

3 个答案:

答案 0 :(得分:7)

这个技巧只适用于全局变量(符号引用寻求当前包的symbol table),i。即

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

如果你想捕捉词汇,你必须使用eval ""

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

但是在没有目的的情况下使用eval ""在Perl中被认为是坏样式,以及使用全局变量。考虑使用真实参考(如果可以的话)。

答案 1 :(得分:4)

在Perl中,您必须使用符号引用,这些实例非常非常少。在所有其他实例中避免使用符号引用与样式无关。它是一个聪明的程序员。正如mjdWhy it's stupid to "use a variable as a variable name"解释的那样:

  

问题代码的真正根源是:它很脆弱。当你这样做的时候,你会混到不同的东西。如果其中两个不同的东西碰巧有相同的名字,它们就会发生碰撞,你会得到错误的答案。所以你最终得到了一长串的名字,你必须小心不要重复使用,如果你搞砸了,你会得到一个非常奇怪的错误。这正是名称空间被发明要解决的问题,而这正是哈希的原因:可移植命名空间。

另请参阅Part 2Part 3

答案 2 :(得分:0)

没有my$$bar适用于我:

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

您可以在a variable as a variable name中找到有关使用Perl FAQ List的更多信息。