Der*_*rpe 4 variables perl global-variables dynamic
好吧,我看起来很努力,并尝试了无数的变化来让这个工作.我需要perl专家的一些帮助.
首先,我知道,我知道,不要使用动态变量名!嗯,我认为在这种情况下我需要这样做.我正在修复一个继承的脚本.它有一组用prefix+ "_"+ 形成的变量suffix.这开始很小,但前缀现在是一个约20的列表和大约50的后缀 - 一千个不同的变量.
在某些情况下,脚本循环遍历这些变量,eval用于检索单个值等.这一切都有效.问题是,在整个脚本中使用不同变量,无论是在前缀和/或后缀的循环内,还是只是硬编码的使用,都假设这些变量通过使用全局化use var qw($varname).use vars硬编码语句的数量已经失去控制.此外,有数千个过去的输入配置文件使用全局语法初始化这些变量,所有这些都需要继续工作.
我希望我可以通过循环中的全球化步骤来提高可维护性,一次动态创建一个变量名,然后使用use vars或全局化它们our.这里有一些代码来展示我的目标.我在这里展示了几个选项,但每个选项实际上都是一个单独的试验.我尝试了其他变化,不能再保持直线了.
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) {
Run Code Online (Sandbox Code Playgroud)
似乎"使用变量"的问题(除了不鼓励的事实)是qw中的字符串必须是实际的变量名,而不是动态变量名.我认为'eval'选项不起作用,因为范围仅存在于eval本身内.
有没有办法在perl中执行此操作?
qw中的字符串必须是实际的变量名,而不是动态变量名
这是如何qw工作,它引用单词,它没有插值.您不必使用qw与use vars,虽然.
#! /usr/bin/perl
use warnings;
use strict;
my @global_vars;
BEGIN { @global_vars = qw($x $y) }
use vars @global_vars;
# strict won't complain:
$x = 1;
$y = 2;
Run Code Online (Sandbox Code Playgroud)
这里需要BEGIN,因为use vars在编译时运行,我们需要已经填充了@global_vars.
没有必要,eval EXPR因为没有必要使用qw.qw只是创建字符串列表的一种方法,而且对您的需求并不特别有用.
my @prefixes; BEGIN { @prefixes = qw( one two ... twenty ); }
my @suffixes; BEGIN { @suffixes = 1..50; }
use vars map { my $p = $_; map { '$'.$p.'_'.$_ } @suffixes } @prefixes;
Run Code Online (Sandbox Code Playgroud)