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

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

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...