2017-10-21 169 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