Perl で変数の値を変数名として使用するにはどうすればよいですか?
-
22-09-2019 - |
質問
変数がある場合、 $bar
, 、文字列と等しい "foo"
そして $foo
に等しい 0xdead
, 、 どうすれば入手することができますか $foo
変数名の文字列しかないのに、 の値はどうなるのでしょうか?
基本的に、グローバル名前空間で一種のポインター間接参照、またはグローバル名前空間でハッシュ ルックアップを実行したいと考えています。
以下は機能しませんでした:
perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
改行のみを出力します。
解決
このトリックは(シンボリック参照がシンボルテーブル現在のパッケージの)、I。電子。
perl -e '$foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
あなたはレキシカルをキャッチしたい場合は、あなたが使用する必要がありますeval ""
perl -e 'my $foo=0xdead; my $bar ="foo"; print eval("\$$bar"),"\n";'
しかし、目的なしにeval ""
を使用することは悪いPerlでスタイルだけでなく、グローバル変数を使用して考えられています。 (できれば)実際の参照の使用を検討します。
他のヒント
Perl では、シンボリック参照を使用しなければならない例が非常に非常にほとんどありません。他のすべてのインスタンスでシンボリック参照を避けることは、スタイルの問題ではありません。それは賢いプログラマーになることです。として MJD で説明します 「変数を変数名として使用する」のが愚かな理由:
問題のコードの本当のルートは次のとおりです。壊れやすいです。これを行うと、物事とは違って混ざり合っています。そして、それらの異なるもののうちの 2 つがたまたま同じ名前を持っていた場合、それらは衝突し、間違った答えが得られるでしょう。したがって、再利用しないように注意しなければならない名前の長いリストが作成されることになり、失敗すると非常に奇妙なエラーが発生します。これはまさに名前空間が解決するために発明された問題であり、それがまさにハッシュです。ポータブルな名前空間。
それなし my
そして $$bar
私にとってはうまくいきます:
$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";' 57005
使用方法について詳しく知ることができます 変数名としての変数 の中に Perl FAQ リスト.