【问题标题】:How can I reference a hash using a variable name?如何使用变量名引用哈希?
【发布时间】:2018-04-02 19:05:05
【问题描述】:

我有一组预定义的哈希表,我想使用变量名引用其中一个哈希表并访问键值。即使填充了哈希,以下代码也只会返回 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

【问题讨论】:

标签: perl hash hashref


【解决方案1】:

使用哈希来包含您的哈希。

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

my $hash_name = 'TEXT1';

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

【讨论】:

    【解决方案2】:

    你的代码可以正常工作*

    %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' 下运行,否则您应该这样做

    【讨论】:

    • 我正在使用strict。有没有办法在不取消引用的情况下做到这一点?
    【解决方案3】:

    以下代码是对标量的赋值,而不是对哈希的赋值:

    my $hash_name = 'TEXT';
    

    以下代码是对哈希的赋值:

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

    要从散列中打印单个元素的值,你说:

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

    您可以引用该哈希并将其分配给变量:

    my $hashref = \%hash;
    

    然后您可以从该 hashref 打印单个元素:

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

    【讨论】:

    • 这不能回答我的问题。我想使用从标量变量中获取的名称来引用散列。换句话说,我已经定义了一组哈希表,我需要根据用户输入从这些表中的任何一个表中访问值。所以标量将定义哈希的名称,然后我想使用该名称定义 hash_ref。抱歉,如果不清楚。
    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2013-08-29
    • 2011-10-18
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多