好的,我看起来很努力,并尝试了无数的变化来让它发挥作用。我需要perl专家的帮助。
首先,我知道,我知道,不要使用动态变量名!嗯,我认为在这种情况下我需要这样做。我正在修复继承的脚本。它有一组由prefix
+ "_"
+ suffix
组成的变量。这开始很小,但前缀现在是一个约20的列表和大约50的后缀 - 一千个不同的变量。
在某些情况下,脚本循环遍历这些变量,使用eval
来检索单个值等。这一切都有效。问题是,在整个脚本中使用不同的变量,无论是在前缀和/或后缀的循环内,还是只是硬编码的使用,都假设这些变量是全球化的使用{{1} }。 use var qw($varname)
硬编码语句的数量已经失去控制。此外,有数千个过去的输入配置文件使用全局语法初始化这些变量,所有这些都需要继续工作。
我希望通过循环中的全球化步骤来提高可维护性,一次动态创建变量名称,然后使用use vars
或{{1}全局化它们}。这里有一些代码来展示我的目标。我在这里展示了几个选项,但每个选项实际上都是一个单独的试验。我尝试了其他变化,不能再保持直线了。
use vars
似乎“使用变量”(除了不鼓励的事实)的问题是qw中的字符串必须是实际的变量名,而不是动态变量名。我认为'eval'选项不起作用,因为范围仅存在于eval本身内。
有没有办法在perl中执行此操作?
答案 0 :(得分:6)
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;
这里需要BEGIN,因为use vars
在编译时运行,我们需要填充@global_vars。
答案 1 :(得分:5)
不需要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;