2017-10-21 331 views
0

我有一組預定義的散列表,我想使用變量名稱引用其中一個散列並訪問鍵值。即使散列填充,下面的代碼也會返回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-變量名 - 在-perl的)。 –

回答

3

使用哈希來包含你的哈希值。

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'; 

以下代碼是分配給一個散列:

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

要打印的a的值單個元素來自散列,你會說:

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

你可以把該散列參考,並分配給一個變量:

my $hashref = \%hash; 

,並從您可以從hashref打印單個元素:

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'

* - 除非你是use strict 'refs'下運行,你應該

+0

'strict'並不能防止你的代碼變得難以維護。 Perl不僅對您應該如何編程有意見,還可以非常容易地通過嚴格啓用來讓程序難以維護。話雖如此,「嚴格」refs''的原因是爲了防止您發生某些意外錯誤。 – Abigail

+0

我正在使用'strict'。有沒有解除引用的方法嗎? – freeworlder