如果我有一个变量$bar
,它等于字符串"foo"
且$foo
等于0xdead
,我怎样才能获得$foo
' s值,而我只有变量名的字符串?
本质上,我想在全局命名空间上执行一种指针间接寻址,或者在全局命名空间上执行哈希查找。
以下不起作用:
perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
它只打印换行符。
答案 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中,您必须使用符号引用,这些实例非常非常少。在所有其他实例中避免使用符号引用与样式无关。它是一个聪明的程序员。正如mjd中Why it's stupid to "use a variable as a variable name"解释的那样:
问题代码的真正根源是:它很脆弱。当你这样做的时候,你会混到不同的东西。如果其中两个不同的东西碰巧有相同的名字,它们就会发生碰撞,你会得到错误的答案。所以你最终得到了一长串的名字,你必须小心不要重复使用,如果你搞砸了,你会得到一个非常奇怪的错误。这正是名称空间被发明要解决的问题,而这正是哈希的原因:可移植命名空间。
答案 2 :(得分:0)
没有my
和$$bar
适用于我:
$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";' 57005
您可以在a variable as a variable name中找到有关使用Perl FAQ List的更多信息。