在perl中使运行时变量名称全局化
好吧,我看起来很努力,并尝试了无数的变化来让这个工作.我需要perl专家的一些帮助.
首先,我知道,不要使用动态变量名!嗯,我认为在这种情况下我需要这样做.我正在修复一个继承的脚本.它有一组由前缀“_”后缀组成的变量.这开始很小,但前缀现在是一个约20的列表和大约50的后缀 – 一千个不同的变量. 在某些情况下,脚本循环遍历这些变量,使用eval来检索单个值等.这一切都有效.问题是,在整个脚本中使用不同变量,无论是在前缀和/或后缀的循环内,还是只是硬编码的使用,都假设这些变量通过使用use var qw($varname)进行全球化.使用vars硬编码语句的数量已经失去控制.此外,有数千个过去的输入配置文件使用全局语法初始化这些变量,所有这些都需要继续工作. 我希望通过循环中的全球化步骤,一次动态创建变量名称,然后使用vars或我们的全局化来提高可维护性.这里有一些代码来展示我的目标.我在这里展示了几个选项,但每个选项实际上都是一个单独的试验.我尝试了其他变化,不能再保持直线了. my @prefixes = ("one","two",...,"twenty"); my @suffixes = ("1","2","50"); my $globalvars = ""; for my $suffix (@suffixes) { for my $prefix (@prefixes) { # option 1 -- remainder of #1 outside of loop # NOTE: 1.a (no comma); 1.b (include comma between vars) $globalvars .= "$$prefix_$suffix,"; # option 2 eval "use vars qw($$prefix_$suffix)"; # option 3 my $g = "$prefix_$suffix"; eval ("use vars qw($$g)"); # option 4 eval ("our $$g"); } } # option 1.a use vars qw($globalvars); # or option 1.b my (eval "$globalvars"); : : : # now use them as global variables if ($one_1 eq ...) { if ($one_10) { 似乎“使用变量”的问题(除了不鼓励的事实)是qw中的字符串必须是实际的变量名,而不是动态变量名.我认为’eval’选项不起作用,因为范围仅存在于eval本身内. 有没有办法在perl中执行此操作? 解决方法
因为不需要使用qw,所以不需要eval EXPR. qw只是创建字符串列表的一种方式,而且对您的需求并不特别有用.
my @prefixes; BEGIN { @prefixes = qw( one two ... twenty ); } my @suffixes; BEGIN { @suffixes = 1..50; } use vars map { my $p = $_; map { '$'.$p.'_'.$_ } @suffixes } @prefixes; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |