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も参照してください変数名として変数を使用するにはどうすればよいですか?

FAQノートへの回答として、変数が整数でインデックス付けされていない場合は、ハッシュテーブルを使用できます。

%main::シンボリック参照を使用することにより、ユーザー定義のハッシュの代わりに、パッケージのシンボルテーブルハッシュ(のような)を使用しているだけです。解決策は、代わりに独自のハッシュまたは実際の参照を使用することです。

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

FAQリスト全体を少なくとも年に1回読む必要があります。

更新:シンボリック参照は不要であり、質問のコンテキストでは非常に有害である可能性があるため、意図的に回答から除外しました。詳細については、「変数を変数名として使用するのが愚かである理由」を参照してください。パート2およびパート3bymjd 。

于 2009-10-11T02:40:40.053 に答える
4

このように変数を文字列化して、結果の変数を取得することはできません。の式を評価することは$msg + iできますが、msgを配列にして、インデックスを作成する方がおそらく良いでしょう$msg[$i]

于 2009-10-11T02:40:25.047 に答える