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

Posted

技术标签:

【中文标题】如何在 Perl 中使用变量作为变量名?【英文标题】:How can I use a variable as a variable name in Perl? 【发布时间】:2010-12-05 16:50:01 【问题描述】:

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

所以我写了以下sn-p

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

它不起作用并出现错误。

【问题讨论】:

你至少可以显示错误。 【参考方案1】:

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 2 和 part 3mjd。

【讨论】:

或者如果 val 没有以数字方式映射,请使用散列: my %errors = ( foo => 'Uh oh!', bar => 'Even bad!', );对于我的 $error (keys %errors) printmsg($errors$error); 【参考方案2】:

您不能像这样将变量串在一起并得到结果变量。您可以计算 $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) 必须存在!由于您没有提供太多代码,因此我无法推断出有关此问题的更多信息。也许你可以提供更多的代码吧?

【讨论】:

以上是关于如何在 Perl 中使用变量作为变量名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用字符串作为变量名? [复制]

如何在 mongodb-native findOne() 中使用变量作为字段名?

如何在 Python 中使用字符串值作为变量名? [复制]

如何使用参数作为变量名?

perl 第六弹 变量 II

matlab 中 如何实现将字符串变量的值作为新的变量名 并对该新的变量名赋值