¿Cómo puedo utilizar una variable como nombre de variable en Perl?

Resuelto asked hace 14 años • 0 respuestas

Necesito lograr lo siguiente 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;

Entonces escribí el siguiente fragmento

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

No funciona y genera errores.

 avatar Oct 11 '09 09:10
Aceptado

Siempre que te encuentres colocando nombres de variables con un índice entero , date cuenta de que deberías haber usado una matriz en su lugar:

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

Consulte también las preguntas frecuentes ¿Cómo puedo utilizar una variable como nombre de variable?

Como señala la respuesta a las preguntas frecuentes, si las variables no están indexadas por un número entero, puede usar una tabla hash:

Al utilizar referencias simbólicas, simplemente está utilizando el hash de la tabla de símbolos del paquete (como %main::) en lugar de un hash definido por el usuario. La solución es utilizar su propio hash o una referencia real.

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

Debe leer la lista completa de preguntas frecuentes al menos una vez al año.

Actualización: dejé deliberadamente 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, consulte ¿Por qué es estúpido "usar una variable como nombre de variable"? , parte 2 y parte 3 por mjd .

Sinan Ünür avatar Oct 11 '2009 02:10 Sinan Ünür

No puedes simplemente encadenar variables de esa manera y obtener una variable resultante. PODRÍAS evaluar la expresión de $msg + i, pero probablemente sea mejor si conviertes msg en una matriz y simplemente indexas: $msg[$i].

Stefan Kendall avatar Oct 11 '2009 02:10 Stefan Kendall

Si lo entiendo, ¡necesitas "eval"!

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

¡Pero recuerda! ¡Todas las variables (@val1, @val2, ..., @valN) deben existir! Como no proporciona demasiado código, no puedo inferir más sobre este problema. Quizás podrías proporcionar más código, ¿eh?

Andre Carneiro avatar Nov 14 '2018 16:11 Andre Carneiro