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

13 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;
Run Code Online (Sandbox Code Playgroud)

所以我写了下面的代码片段

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

它不起作用并且会出错.

Sin*_*nür 34

每当您发现自己使用整数索引对变量名称进行后缀时,请认识到您应该使用数组:

my @msgs = ('msg1', 'msg2', ..., 'msg6');
my @vals = ( [ @val1 ], [ @val2 ], ..., [ @val6 ] );
Run Code Online (Sandbox Code Playgroud)

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

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

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

$USER_VARS{"fred"} = 23;
my $varname = "fred";
$USER_VARS{$varname}++;  # not $$varname++
Run Code Online (Sandbox Code Playgroud)

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

更新:我故意在我的答案中留下了符号引用,因为它们是不必要的,并且可能在您的问题中非常有害.有关更多信息,请参阅"将变量用作变量名称"为何愚蠢?,第2部分第3部分mjd.

  • 或者如果val没有以数字方式映射,请使用哈希:my%errors =(foo =>'呃哦!',bar =>'更糟糕!',); 我的$ error(密钥%错误){printmsg($ errors {$ error}); } (3认同)

Ste*_*all 5

你不能像这样将变量串起来并获得结果变量.您可以评估表达式$msg + i,但如果您将msg设为数组并且只是索引,则可能更好:$msg[$i].