【问题标题】:How can I use the value of a variable as a variable name in Perl?如何在 Perl 中使用变量的值作为变量名?
【发布时间】:2011-01-19 20:19:54
【问题描述】:

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

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

以下操作无效:

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

它只打印换行符。

【问题讨论】:

标签: perl symbolic-references


【解决方案1】:

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

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

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

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

但是在 Perl 中无目的使用 eval "" 被认为是不好的风格,以及使用全局变量。考虑使用真实的参考资料(如果可以的话)。

【讨论】:

    【解决方案2】:

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

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

    另请参阅 Part 2Part 3

    【讨论】:

    • 我的目标是遍历一堆变量,如果任何变量设置为某个值,我想报告该变量名称。因此我需要变量值和变量名。
    • @Ross Rogers 这些变量是否有某种关联?想必。然后,使用哈希。这就是符号表:一个散列。
    • 我正在与一个旧的自定义选项解析器交互,该解析器将其值存储在全局命名空间中。如果按照我的方式,我们不会使用我们自己的自定义选项解析器,而是使用 parseopts。
    【解决方案3】:

    没有my$$bar 对我有用:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多