1

$bar文字列"foo"$foo等しく、 に等しい変数 がある場合、変数名の文字列しか持っていない0xdeadのに、どうすれば の値を取得できますか?$foo

基本的に、私はグローバル名前空間で一種のポインター間接化またはグローバル名前空間でのハッシュ ルックアップを実行したいと考えています。

以下は機能しませんでした:

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

改行のみを出力します。

4

3 に答える 3

7

このトリックは、グローバル変数でのみ機能します (シンボリック参照は現在のパッケージのシンボル テーブルを探します)。

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 では、グローバル変数を使用するのと同様に、目的なく使用することは悪いスタイルと見なされます。実際の参照を使用することを検討してください (可能であれば)。

于 2010-02-22T21:55:04.623 に答える
4

Perl でシンボリック参照を使用しなければならない例は、非常に非常にまれです。他のすべてのインスタンスでシンボリック参照を避けることは、スタイルに関することではありません。それは賢いプログラマーであることです。なぜ「変数を変数名として使用するのはばかげている」でmjd説明しているように:

問題のコードの本当の根源は次のとおりです。脆弱です。あなたがこれを行うとき、あなたは物事とは違って混ざり合っています. そして、それらの似ていないものが 2 つ同じ名前である場合、それらは衝突し、間違った答えが得られます。そのため、再利用しないように注意する必要がある名前の長いリストができてしまい、失敗すると非常に奇妙なエラーが発生します。これはまさに名前空間が解決するために発明された問題であり、それがまさにハッシュとは何か、つまり移植可能な名前空間です。

第 2 部および第 3部も参照してください。

于 2010-02-22T23:10:44.307 に答える
0

なしmy$$bar私のために働く:

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

変数を変数名として使用する方法については、Perl FAQ リストを参照してください。

于 2010-02-22T21:56:00.923 に答える