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 符号引用的危险在于,将程序转换为意大利面条代码或覆盖您不想要的变量通常太容易了.通过使用显式哈希,可以将您正在进行的操作限制在一个定义明确且范围有限的范围内.散列本身可以是词法,允许对变量进行适当的自动垃圾收集. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |