gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:30:10 42 4
gpt4 key购买 nike

好的,我已经努力寻找并尝试了无数变体来使其发挥作用。我需要 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/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com