2009-10-11 7 views
10

que necesita para alcanzar el siguiente en Perl¿Cómo puedo usar una variable como nombre 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; 

Así que escribí el siguiente fragmento

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

No funciona y estalla con errores.

+0

Al menos podría mostrar los errores. –

Respuesta

4

No puede simplemente unir variables así y obtener una variable resultante. Usted PODRÍA evaluar la expresión de $msg + i, pero probablemente sea mejor si hace msg una matriz y simplemente indexa: $msg[$i].

31

Whenever you find yourself postfixing variable names with an integer index, se dan cuenta de que debería haber utilizado una matriz en lugar:

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

Véase también el FAQ How can I use a variable as a variable name?

como la respuesta a las preguntas más frecuentes notas, si las variables no son indexados por un entero, se puede utilizar una tabla hash:

mediante el uso de referencias simbólicas, usted está usando hash de la tabla de símbolos del paquete (como %main::) en lugar de una hash definido por el usuario. La solución es usar tu propio hash o una referencia real en su lugar.

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

Usted debe leer toda la lista de preguntas frecuentes, al menos una vez al año.

Actualización: A propósito dejé referencias simbólicas fuera de mi respuesta porque son innecesarias y probablemente muy dañinas en el contexto de su pregunta. Para obtener más información, vea Why it's stupid to 'use a variable as a variable name'?, part 2 y part 3 por mjd.

+3

O si val no se asigna numéricamente, use hashs: my% errors = (foo => 'Uh oh!', bar => '¡Peor aún!', ); para mi $ error (claves% errores) { printmsg ($ errors {$ error}); } – Oesor

Cuestiones relacionadas