我该如何在Perl中使用变量作为变量名?

18

我需要在Perl中实现以下功能。

printmsg(@val1, $msg1) if @val1;
printmsg(@val2, $msg2) if @val2;
printmsg(@val3, $msg3) if @val3;
printmsg(@val4, $msg4) if @val4;
printmsg(@val5, $msg5) if @val5;
printmsg(@val6, $msg6) if @val6;

所以我写了下面这段代码

for(my $i=1; $i < 6; $i++ ) {
    printmsg(@val$i, $msg$i) if @val$i;
}

它不能正常工作且会出现错误。


2
你至少可以展示错误信息。 - Brian Carlton
3个回答

37

无论何时你发现自己在变量名后面加上整数索引,意识到你应该使用数组:

my @msgs = ('msg1', 'msg2', ..., 'msg6');
my @vals = ( [ @val1 ], [ @val2 ], ..., [ @val6 ] );

另请参阅常见问题解答如何将变量用作变量名?

正如常见问题解答所述,如果变量没有按整数进行索引,您可以使用哈希表:

By using symbolic references, you are just using the package's symbol-table hash (like %main::) instead of a user-defined hash. The solution is to use your own hash or a real reference instead.

$USER_VARS{"fred"} = 23;
my $varname = "fred";
$USER_VARS{$varname}++;  # not $$varname++

你应该每年至少阅读一次完整的常见问题解答列表。

更新:我故意在回答中省略了符号引用,因为它们在你的问题背景下是不必要的,很可能会带来很大的危害。有关更多信息,请参见为什么使用变量作为变量名很愚蠢?第二部分第三部分,作者是mjd


4
如果val不能被数字映射,就使用哈希表:my %errors = ( foo => 'Uh oh!', bar => 'Even worse!', ); for my $error (keys %errors) { printmsg($errors{$error}); } (说明:此代码段使用Perl编写,通过哈希表存储错误消息,并逐个输出它们。如果 "val" 参数无法以数字形式映射到哈希表中的键,则可以使用哈希表来存储错误消息。) - Oesor

5

您不能简单地将变量连接起来并得到结果变量。您可以评估$msg + i表达式,但最好让msg成为一个数组,并使用索引:$msg[$i]


3
如果我理解正确,您需要使用 "eval" 函数!
for(my $i=1; $i < 6; $i++ ) {
  eval 'printmsg(@val'. $i . ', $msg' . $i .') if @val' . $i;
}

但要记住!所有变量(@val1,@val2,...,@valN)必须存在!由于您没有提供太多代码,我无法推断出更多关于这个问题的信息。也许你可以提供更多的代码吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接