Come posso utilizzare il valore di una variabile come un nome di variabile in Perl?

StackOverflow https://stackoverflow.com/questions/2314507

  •  22-09-2019
  •  | 
  •  

Domanda

Se ho una variabile, $bar, che è uguale a "foo" corda e $foo è pari a 0xdead, come posso ottenere il valore di $foo mentre ho solo la stringa per il nome della variabile?

In sostanza, voglio fare una sorta di puntatore indiretto sul namespace globale o una ricerca hash sul namespace globale.

Di seguito non ha funzionato:

perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

Esso stampa solo il ritorno a capo.

È stato utile?

Soluzione

Questo trucco funziona solo con le variabili globali (riferimenti simbolici cercano il tabella dei simboli del pacchetto corrente), i. e.

perl -e '$foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

Se si desidera catturare lessicali, dovrete usare eval ""

perl -e 'my $foo=0xdead; my $bar ="foo"; print eval("\$$bar"),"\n";' 

Ma usando eval "" senza scopo è considerato cattivo stile in Perl, così come l'utilizzo di variabili globali. Considerare l'utilizzo di riferimenti reali (se potete).

Altri suggerimenti

Ci sono molto molto molto preziosamente pochi casi in Perl in cui è necessario utilizzare riferimenti simbolici. Evitare riferimenti simbolici in tutti gli altri casi non si tratta di stile. Si tratta di essere un programmatore intelligente. Come mjd spiega in Perché è stupido a "usare una variabile come un nome di variabile" :

  

La vera radice del problema è il codice: E 'fragile. Stai mescolandosi a differenza di cose quando si esegue questa operazione. E se due di questi a differenza di cose capita di avere lo stesso nome, faranno si scontrano e si otterrà la risposta sbagliata. Così si finisce per avere tutta una lunga lista di nomi che si deve stare attenti a non riutilizzare, e se si fallisce, si ottiene un errore molto bizzarro. Questo è esattamente il problema che gli spazi dei nomi sono stati inventati per risolvere, e questo è proprio quello che un hash è: un namespace portatile.

Si veda anche Parte 2 e Parte 3 .

Senza my e con $$bar funziona per me:

$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";'
57005

E 'possibile trovare maggiori informazioni su utilizzando una variabile come un nome variabile nel Perl FAQ List .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top