17

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

它不起作用并出现错误。

4

3 回答 3

36

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

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

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

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

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

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

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

更新:我故意将符号引用排除在我的答案之外,因为它们在您的问题的上下文中是不必要的并且可能非常有害。有关更多信息,请参阅为什么“使用变量作为变量名”很愚蠢?第 2 部分第 3 部分,作者:mjd

于 2009-10-11T02:40:40.053 回答
4

您不能像那样将变量串在一起并获得结果变量。您可以评估 的表达式$msg + i,但如果您将 msg 设为数组并仅使用 index: 可能会更好$msg[$i]

于 2009-10-11T02:40:25.047 回答
2

如果我理解,您需要“评估”!

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

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

于 2018-11-14T16:34:40.453 回答