Perl,在另一个标量中按名称访问变量

前端之家收集整理的这篇文章主要介绍了Perl,在另一个标量中按名称访问变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很确定这适用于perl,但我不知道如何编写代码.
我可以用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

符号引用的危险在于,将程序转换为意大利面条代码或覆盖您不想要的变量通常太容易了.通过使用显式哈希,可以将您正在进行的操作限制在一个定义明确且范围有限的范围内.散列本身可以是词法,允许对变量进行适当的自动垃圾收集.

猜你在找的Perl相关文章