在Perl中如何使用变量的值作为变量名?

在Perl中如何使用变量的值作为变量名?,perl,symbolic-references,Perl,Symbolic References,如果我有一个变量,$bar,它等于string“foo”,$foo等于0xdead,那么当我只有变量名的字符串时,如何才能得到$foo的值 本质上,我想在全局名称空间上执行一种指针间接寻址,或者在全局名称空间上执行哈希查找 以下操作不起作用: perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 它只打印换行符。此技巧仅适用于全局变量(符号引用查找当前包的符号),即。e 如果你想捕捉词汇,你必须使用eval”“ 但是在Pe

如果我有一个变量,
$bar
,它等于string
“foo”
$foo
等于
0xdead
,那么当我只有变量名的字符串时,如何才能得到
$foo
的值

本质上,我想在全局名称空间上执行一种指针间接寻址,或者在全局名称空间上执行哈希查找

以下操作不起作用:

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

它只打印换行符。

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

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


但是在Perl中,毫无目的地使用
eval”“
和使用全局变量一样被认为是不好的风格。考虑使用实际引用(如果你可以)。

< P>此技巧只适用于全局变量(符号引用寻找当前包的),I。e

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


但是在Perl中,毫无目的地使用
eval”“
和使用全局变量一样被认为是不好的风格。考虑使用实际的引用(如果你可以)。< /P> < P>没有<代码>我的<代码>和<代码> $Bar < /COD> >为我工作:

$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";' 57005 $perl-e'$foo=0xdead$bar=“foo”;打印$$bar。“\n”;' 57005
您可以在。

中找到有关使用的更多信息,不使用
my
和使用
$$bar
对我有效:

$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";' 57005 $perl-e'$foo=0xdead$bar=“foo”;打印$$bar。“\n”;' 57005
您可以在中找到有关使用的更多信息。

在Perl中,必须使用符号引用的实例非常少。在所有其他实例中避免符号引用与样式无关。这是关于成为一个聪明的程序员。如中所述:

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


另请参见和。

在Perl中,必须使用符号引用的实例非常少。在所有其他实例中避免符号引用与样式无关。这是关于成为一个聪明的程序员。如中所述:

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


另请参见和。

在您走这条路之前,请确保您已经阅读了所有内容:。另请参见。。。哦,还有,你不应该这样做。在你走那条路之前,确保你已经阅读了所有这些:。另请参阅。。。哦,你不应该这样做。我的目标是迭代一组变量,如果其中任何一个变量被设置为某个值,我想报告变量名。因此,我需要知道变量值和变量名。@Ross Rogers,这些变量有什么关联吗?大概然后,使用散列。这就是符号表的含义:散列。我正在与一个旧的自定义选项解析器交互,该解析器将其值存储在全局名称空间中。如果按照我的方式,我们不会使用我们自己的自定义选项解析器,而是使用parseopts。我的目标是迭代一组变量,如果任何变量设置为某个值,我想报告该变量名。因此,我需要知道变量值和变量名。@Ross Rogers,这些变量有什么关联吗?大概然后,使用散列。这就是符号表的含义:散列。我正在与一个旧的自定义选项解析器交互,该解析器将其值存储在全局名称空间中。如果按照我的方式,我们不会使用自己的自定义选项解析器,而是使用parseopts。 $ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";' 57005