perl - 在 perl 中使运行时变量名称成为全局变量

标签 perl variables dynamic global-variables

好的,我已经努力寻找并尝试了无数变体来使其发挥作用。我需要 perl 专家的帮助。

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

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

我希望我可以通过在循环中执行全局化步骤来提高可维护性,一次动态创建一个变量名,然后使用 use varsour 将它们全局化。这是一些代码来显示我所追求的。我在这里展示了几个选项,但每个选项实际上都是一个单独的试验。我尝试了其他变体,但不能再保持直线了。

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) {

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

有没有办法在 perl 中做到这一点?

最佳答案

不需要 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;

关于perl - 在 perl 中使运行时变量名称成为全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30505975/

相关文章:

android - 如何获取动态添加的多个EditText的ID?

perl - 在 Catalyst 中显式调用 View

perl - 了解在 if block 中使用 use 关键字加载模块时的 Perl 行为

java - 我可以在 IntelliJ 中使用 Java 更新和设置多个变量吗?不,我不能

java - 拆分临时变量重构示例

jquery-plugins - 如何使用 JQUERY 使用多个表单输入动态过滤表行

perl - 在 perl 中将原始十六进制转换为可读的十六进制?

Perl 构建、单元测试、代码覆盖率 : A complete working example

c - 如何使用 C 函数中的值

c# - 动态创建控件