1

如果我有一个变量 ,$bar它等于字符串"foo"并且$foo等于0xdead,我如何获得$foo的值,而我只有变量名的字符串?

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

以下没有奏效:

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

它只打印换行符。

4

3 回答 3

7

此技巧仅适用于全局变量(符号引用查找当前包的符号表),即

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 中无目的使用被认为是不好的风格,以及使用全局变量。考虑使用真实的参考资料(如果可以的话)。

于 2010-02-22T21:55:04.623 回答
4

在 Perl 中,您必须使用符号引用的实例非常非常非常少。在所有其他情况下避免符号引用与风格无关。这是关于成为一个聪明的程序员。正如mjd“为什么将变量用作变量名”中解释的那样

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

另见第 2部分和第 3 部分

于 2010-02-22T23:10:44.307 回答
0

没有my和有$$bar适合我的作品:

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

您可以在Perl FAQ List中找到更多关于使用变量作为变量名的信息。

于 2010-02-22T21:56:00.923 回答