加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:26:00 所属栏目:大数据 来源:网络整理
导读:好吧,我看起来很努力,并尝试了无数的变化来让这个工作.我需要perl专家的一些帮助. 首先,我知道,不要使用动态变量名!嗯,我认为在这种情况下我需要这样做.我正在修复一个继承的脚本.它有一组由前缀“_”后缀组成的变量.这开始很小,但前缀现在是一个约20的列表
好吧,我看起来很努力,并尝试了无数的变化来让这个工作.我需要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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读