2009-10-11 7 views
10

J'ai besoin pour obtenir les résultats suivants en perlComment puis-je utiliser une variable comme nom de variable en 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; 

j'ai donc écrit l'extrait suivant

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

Il ne fonctionne pas et éclate avec des erreurs.

+0

Vous pouvez au moins afficher les erreurs. –

Répondre

4

Vous ne pouvez pas simplement chaîner des variables comme cela et obtenir une variable résultante. Vous POUVEZ évaluer l'expression de $msg + i, mais c'est probablement mieux si vous faites msg un tableau et simplement index: $msg[$i].

31

Whenever you find yourself postfixing variable names with an integer index, se rendre compte que vous avez utilisé un tableau à la place:

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

Voir aussi la FAQ How can I use a variable as a variable name?

Comme la réponse aux notes FAQ, si les variables ne sont pas indexés par un entier, vous pouvez utiliser une table de hachage:

en utilisant des références symboliques, vous utilisez simplement le hachage symbole de table du paquet (comme %main::) au lieu d'un hash défini par l'utilisateur. La solution est d'utiliser votre propre hash ou une vraie référence à la place.

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

Vous devriez lire la liste complète des FAQ au moins une fois par an.

Mise à jour: J'ai délibérément laissé des références symboliques hors de ma réponse car elles sont inutiles et probablement très néfastes dans le contexte de votre question. Pour plus d'informations, voir Why it's stupid to 'use a variable as a variable name'?, part 2 et part 3 par mjd.

+3

Ou si val ne mappe pas numériquement, utilisez des hachages: my% errors = (foo => 'Uh oh!', bar => 'Encore pire!', ); pour mon erreur $ (clés% erreurs) { printmsg ($ errors {$ error}); } – Oesor

Questions connexes