2017-10-21 11 views
0

私はあらかじめ定義されたハッシュテーブルのセットを持っており、それらのハッシュの1つを変数名で参照し、キー値にアクセスしたいと考えています。次のコードは、ハッシュに値が設定されていてもnullを返します。私はここで間違って何をしているのですか、これを達成する良い方法がありますか?変数名を使用してハッシュを参照するにはどうすればよいですか?

my %TEXT1 = (1 => 'Hello World',); 
my %TEXT2 = (1 => 'Hello Mars',); 
my %TEXT3 = (1 => 'Hello Venus',); 

my $hash_name = 'TEXT1'; 

my $hash_ref = \%$hash_name; 
print ${$hash_ref}{1}; #prints nothing 
+0

あなたが 'my $ hash_ref = \%$ hash_name'で期待していたことを説明すると、多くの助けになります。 – Borodin

+0

私は、hash_refが変数名で定義されたハッシュを参照するようにします。明確にするために編集された質問。 – freeworlder

+0

も参照してください[整数インデックスで変数名を後置すると、配列を代わりに使用しているはずです。](https://stackoverflow.com/questions/1549685/how-can-i-use-a-variable -as-a-variable-name-perl)を使用します。 –

答えて

3

はあなたのハッシュを格納するハッシュを使用する必要がありますされ、use strict 'refs'の下で実行されていない限り。

my %texts = (
    TEXT1 => { 1 => 'Hello world', }, 
    TEXT2 => { 1 => 'Hello Mars', }, 
    TEXT3 => { 1 => 'Hello Venus', }, 
) 

my $hash_name = 'TEXT1'; 

print $texts{$hash_name}{1}, "\n"; 
+1

完璧、ありがとう! – freeworlder

0

次のコードは、スカラーにではなくハッシュへの割り当てである:

my $hash_name = 'TEXT'; 

次のコードは、ハッシュに割り当て、次のとおりである:aの値を印刷するために

my %hash = (alpha => 'beta', gamma => 'delta'); 

ハッシュからの単一要素、あなたは言う:

print $hash{alpha}, "\n"; 

あなたは、そのハッシュへの参照を取得し、変数にそれを割り当てることができます。

my $hashref = \%hash; 

そして、それから、あなたはそのハッシュリファレンスから単一の要素を印刷することができます。

print $hashref->{alpha}, "\n"; 
+1

これは私の質問に答えません。私はスカラー変数から取られた名前でハッシュを参照したい。言い換えれば、私は既に定義されたハッシュテーブルのセットを持っているので、ユーザの入力に応じてこれらのテーブルのいずれかから値にアクセスする必要があります。だからスカラーはハッシュの名前を定義し、その名前を使ってhash_refを定義したいと思う。申し訳ありませんが、これが明確でない場合。 – freeworlder

+0

私の編集した質問をご覧ください。 – freeworlder

5

あなただけの作品を持っているコード細かい*

%TEXT = (1 => abc, 42 => def); 
$name = 'TEXT'; 
print ref($name);   # "" 
no strict 'refs'; 
print ${$name}{1};  # "abc" 
print $name->{42}   # "def" 
$ref = \%$name; 
print ref($ref);   # "HASH" 
print $ref->{1};   # "abc" 
print ${$ref}{42};  # "def" 

あなたは間違ってやっている主なものはmaking your code an unmaintainable messあり、それは、なぜこのようなものですuse strict 'refs'の下には物事の許可は認められません。

* - あなたは

+0

'strict'はあなたのコードを維持できない混乱から守るためにはありません。 Perlはプログラムの仕方について意見を持っているだけでなく、厳密に有効にしてプログラムからメンテナンスができないようにするのも非常に簡単です。だからこそ、「厳密な基準」の理由は、あなたが間違った誤操作をしないようにするためです。 – Abigail

+0

私は 'strict'を使用しています。逆参照なしでこれを行う方法はありますか? – freeworlder

関連する問題