Come posso usare una variabile come nome di variabile in Perl?

Ho bisogno di raggiungere il seguente in 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; 

Così ho scritto il seguente frammento

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

Non funziona e scoppia con errori.

Ogni volta che ti trovi a postare i nomi delle variabili con un indice intero , rendi conto che avresti dovuto usare un array invece:

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

Vedi anche le FAQ Come posso usare una variabile come nome di una variabile?

Come risposta alle note della FAQ, se le variabili non sono indicizzate da un numero intero, puoi usare una tabella hash:

Usando riferimenti simbolici, stai semplicemente usando l’hash della tabella dei simboli del pacchetto (come %main:: invece di un hash definito dall’utente. La soluzione è utilizzare il proprio hash o un riferimento reale.

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

Dovresti leggere l’intera lista delle FAQ almeno una volta all’anno.

Aggiornamento: ho intenzionalmente lasciato fuori dalla mia risposta riferimenti simbolici perché non sono necessari e probabilmente molto dannosi nel contesto della tua domanda. Per ulteriori informazioni, vedi Perché è stupido “usare una variabile come nome di variabile”? , parte 2 e parte 3 di mjd .

Non puoi semplicemente stringere le variabili in questo modo e ottenere una variabile risultante. POTREBBE valutare l’espressione di $msg + i , ma probabilmente è meglio se si crea un array di msg e basta indicizzare: $msg[$i] .