Frage

Wenn ich eine Variable, $bar habe, der Zeichenfolge "foo" gleich ist und $foo gleich 0xdead, wie kann ich $foo Wert bekommen, während ich die die Zeichenfolge für die Variablennamen nur haben?

Im Grunde mag ich auf dem globalen Namespace oder einen Hash-Lookup auf dem globalen Namespace eine Art Zeiger indirection tun.

Im Folgenden hat nicht funktioniert:

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

Es druckt nur die Newline.

War es hilfreich?

Lösung

Dieser Trick funktioniert nur mit globalen Variablen (symbolische Referenzen suchen die Symboltabelle des aktuellen Paket), i. e.

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

Wenn Sie fangen Lexikale wollen, müssen Sie verwenden müssen eval ""

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

Aber mit eval "" ohne Zweck ist schlechter Stil in Perl betrachtet sowie mit globalen Variablen. Betrachten Sie mit echten Referenzen (wenn Sie können).

Andere Tipps

Es gibt sehr sehr sehr kostbar wenige Fälle, in Perl, wo Sie symbolische Referenzen verwenden. Vermeiden von symbolischen Referenzen in allen anderen Fällen geht es nicht um Stil. Es handelt sich um eine intelligente Programmierer zu sein. Wie mjd erklärt in Warum es "eine Variable als Variablenname" dumm ist:

  

Die eigentliche Wurzel des Problems Code ist: Es ist zerbrechlich. Sie sind im Gegensatz zu Vermengung Dinge, wenn Sie dies tun. Und wenn zwei dieser im Gegensatz Dinge passieren den gleichen Namen haben, werden sie zusammenstoßen, und Sie werden die falsche Antwort. So haben Sie eine ganze lange Liste von Namen am Ende mit dem Sie nicht zu Wiederverwendung vorsichtig sein, und wenn Sie vermasseln, erhalten Sie einen sehr bizarren Fehler. Genau das ist das Problem, dass Namensräume wurden zu lösen erfunden, und das ist genau das, was ein Hash ist: Ein tragbarer Namespace.

Siehe auch Teil 2 und Teil 3 .

Ohne my und mit $$bar funktioniert für mich:

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

Sie können mehr über die Verwendung von eine Variable als Variablenname im Perl FAQ-Liste .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top