在perl中使运行时变量名称全局化

时间:2015-05-28 11:58:15

标签: perl variables dynamic global-variables

好的,我看起来很努力,并尝试了无数的变化来让它发挥作用。我需要perl专家的帮助。

首先,我知道,我知道,不要使用动态变量名!嗯,我认为在这种情况下我需要这样做。我正在修复继承的脚本。它有一组由prefix + "_" + suffix组成的变量。这开始很小,但前缀现在是一个约20的列表和大约50的后缀 - 一千个不同的变量。

在某些情况下,脚本循环遍历这些变量,使用eval来检索单个值等。这一切都有效。问题是,在整个脚本中使用不同的变量,无论是在前缀和/或后缀的循环内,还是只是硬编码的使用,都假设这些变量是全球化的使用{{1} }。 use var qw($varname)硬编码语句的数量已经失去控制。此外,有数千个过去的输入配置文件使用全局语法初始化这些变量,所有这些都需要继续工作。

我希望通过循环中的全球化步骤来提高可维护性,一次动态创建变量名称,然后使用use vars或{{1}全局化它们}。这里有一些代码来展示我的目标。我在这里展示了几个选项,但每个选项实际上都是一个单独的试验。我尝试了其他变化,不能再保持直线了。

use vars

似乎“使用变量”(除了不鼓励的事实)的问题是qw中的字符串必须是实际的变量名,而不是动态变量名。我认为'eval'选项不起作用,因为范围仅存在于eval本身内。

有没有办法在perl中执行此操作?

2 个答案:

答案 0 :(得分:6)

  

qw中的字符串必须是实际的变量名,而不是动态变量名

qw如何运作,引用单词,不进行插值。但是,您不必将qwuse 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,因为不需要使用qwqw只是创建字符串列表的一种方式,而且对您的需求并不特别有用。

my @prefixes;  BEGIN { @prefixes = qw( one two ... twenty ); }
my @suffixes;  BEGIN { @suffixes = 1..50; }

use vars map { my $p = $_; map { '$'.$p.'_'.$_ } @suffixes } @prefixes;