如果我有一个变量 ,$bar
它等于字符串"foo"
并且$foo
等于0xdead
,我如何获得$foo
的值,而我只有变量名的字符串?
本质上,我想对全局命名空间进行一种指针间接寻址,或者对全局命名空间进行哈希查找。
以下没有奏效:
perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
它只打印换行符。
如果我有一个变量 ,$bar
它等于字符串"foo"
并且$foo
等于0xdead
,我如何获得$foo
的值,而我只有变量名的字符串?
本质上,我想对全局命名空间进行一种指针间接寻址,或者对全局命名空间进行哈希查找。
以下没有奏效:
perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
它只打印换行符。
此技巧仅适用于全局变量(符号引用查找当前包的符号表),即
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 中无目的使用被认为是不好的风格,以及使用全局变量。考虑使用真实的参考资料(如果可以的话)。
在 Perl 中,您必须使用符号引用的实例非常非常非常少。在所有其他情况下避免符号引用与风格无关。这是关于成为一个聪明的程序员。正如mjd在“为什么将变量用作变量名”中解释的那样:
问题代码的真正根源是:它很脆弱。当你这样做时,你正在混合不同的东西。如果其中两个不同的东西碰巧有相同的名字,它们就会发生冲突,你会得到错误的答案。所以你最终得到了一长串名字,你必须小心不要重复使用,如果你搞砸了,你会得到一个非常奇怪的错误。这正是命名空间被发明来解决的问题,而这正是哈希的本质:一个可移植的命名空间。
没有my
和有$$bar
适合我的作品:
$ perl -e '$foo=0xdead;$bar="foo"; 打印 $$bar."\n";' 57005
您可以在Perl FAQ List中找到更多关于使用变量作为变量名的信息。