加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:08:00 所属栏目:大数据 来源:网络整理
导读:我很确定这适用于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,但我不知道如何编写代码.
我可以用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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读