如何在Perl中将变量用作变量名?

时间:2009-10-11 02:33:52

标签: perl symbolic-references

我需要在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;
}

它无法正常运行并出现错误。

3 个答案:

答案 0 :(得分:34)

Whenever you find yourself postfixing variable names with an integer index,意识到你应该使用数组:

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

另请参阅常见问题解答How can I use a variable as a variable name?

作为FAQ注释的答案,如果变量没有用整数索引,你可以使用哈希表:

  

通过使用符号引用,您只是使用包的符号表哈希(如%main::)而不是用户定义的哈希。解决方案是使用您自己的哈希或实际引用。

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

您应该每年至少阅读一次整个常见问题列表。

更新:我故意将符号引用留在我的答案之外,因为它们是不必要的,并且可能在您的问题中非常有害。有关详细信息,请参阅Why it's stupid to 'use a variable as a variable name'?part 2part 3mjd

答案 1 :(得分:5)

您不能像这样将变量串起来并获得结果变量。您可以评估$msg + i的表达式,但如果您将msg设为数组并且仅将索引编译为$msg[$i],则可能会更好。

答案 2 :(得分:2)

据我了解,您需要“评估”!

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

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