我很确定这适用于perl,但我不知道如何编写代码.
我可以用eval想象它,但那不是我想要的.
我可以用eval想象它,但那不是我想要的.
my $foo = 0; my $varname = "foo"; $($varname) = 1; # how to do this? # I want to access a scalar that name is in a other scalar # so $foo should be 1 Now.
谢谢
解决方法
Perl有两个独立但基本兼容的可变系统.
包变量,它们是完全限定名的$Some :: Package :: variable或用我们声明的词法名.包变量存在于符号表中,对整个程序是全局的,可以是符号解引用的目标,并且可以给出具有局部的动态范围.
用我声明的词汇变量包含另一个变量系统.这些变量不存在于包或符号表中(而是存在于附加到范围的词法填充中).这些变量不是全局变量,不能象征性地引用,也不能具有动态范围.这就是为什么你不能使用$$varname并期望它找到一个词法变量.
>使用包变量,完全限定名,或使用我们声明,保持严格关闭,并使用符号引用:
our $x = 1; our $y = 'x'; say $x; # 1 $$y = 5; # this line is an error if `use strict` is loaded say $x; # 5
>使用包变量并遍历符号表:
$main::x = 1; my $y = 'x'; ${$main::{$y}} = 5; # ok with `use strict` say $main::x; # 5
>最佳实践方法是使用哈希(这是上面两个例子在幕后做的,因为符号表本身就是哈希)
my %data = (x => 1); my $y = 'x'; $data{$y} = 5; say $data{x}; # 5
符号引用的危险在于,将程序转换为意大利面条代码或覆盖您不想要的变量通常太容易了.通过使用显式哈希,可以将您正在进行的操作限制在一个定义明确且范围有限的范围内.散列本身可以是词法,允许对变量进行适当的自动垃圾收集.