2010-02-22 124 views
1

如果我有一个变量,$bar,它等于字符串"foo"$foo等于0xdead,我怎样才能得到$foo的值,而我只有变量名的字符串?如何在Perl中使用变量的值作为变量名?

从本质上讲,我想做一种指针间接的对全局命名空间还是全局命名空间的哈希查找。

下不工作:

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

它只打印的换行符。

+1

在你踏上这条路之前,请确保你阅读了所有这些内容:http://perl.plover.com/varvarname.html。 – FMc 2010-02-22 22:20:19

+1

另请参阅http://stackoverflow.com/questions/1549685/how-can-i-use-a-variable-as-a-variable-name-in-perl/1549695#1549695 ...哦,和,* *你不应该这样做。** – 2010-02-22 22:58:00

回答

7

这一招仅适用于全局变量(符号引用寻求当前包的symbol table),我。即

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,以及使用全局变量。考虑使用真实的参考(如果可以的话)。

4

有非常非常非常珍贵在Perl少数情况下,必须使用符号引用。在所有其他情况下避免符号引用不是关于样式。这是一个聪明的程序员。作为mjd解释Why it's stupid to "use a variable as a variable name"

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

另请参阅Part 2Part 3

+0

我的目标是迭代一堆变量,并且如果任何变量设置为某个值,我想报告该变量名称。因此我需要变量值和变量名称。 – 2010-02-22 23:32:07

+3

@罗斯罗杰斯这些变量有点相关吗?想必。然后,**使用散列**。这就是符号表:哈希。 – 2010-02-23 00:06:03

+0

我与一个旧的自定义选项解析器接口,该解析器将其值存储在全局名称空间中。如果我有我的方式,我们不会使用我们自己的自定义选项解析器,而是使用parseopts。 – 2010-02-23 00:12:28

相关问题