在perl中,我如何获取散列的值,其散列名称存储在字符串中?

0 perl hash reference

我试图读取散列的值,其名称和索引存储在一个字符串中.我只能获得值,如果我硬编码哈希及其索引,但不是如果我从另一个变量.为了更好地描述它,我已经提到了以下代码:

    use strict 'vars';
    #------------------------------

    # Hash to store some values
    our %SystemUser = (
                Username => "system",
                Password => "system"
    );

    # Prints successfully if i use the below technique
    print "Using Hard-Coding technique : ${SystemUser{'Password'}}\n";

    my $Reference = "SystemUser{'Password'}";

    # Doesn't print if i use this technique where $Reference contains the hash-index pair 
    print "Using Referencing technique : ${$Reference}\n";

    print "Reference value : $Reference\n";
Run Code Online (Sandbox Code Playgroud)

我想打印的值SystemUser{'Password'}使用${$Reference}(其$Reference = "SystemUser{'Password'}"值)

DVK*_*DVK 6

首先,您应该避免将此作为技术方法.

如果需要按名称动态获取一组哈希值,那么正确的解决方案(来自Java世界的模式)就是将散列存储在hashrefs散列中 ; 使用外部哈希的键是各个哈希名称应该是什么:

my %users = (
     SystemUser => {
            Username => "system",
            Password => "system"
     }
    ,GuestUser => {
            Username => "xxx",
            Password => "xxx"
     }

);
print "$users{SystemUser}->{Password}";
Run Code Online (Sandbox Code Playgroud)

在技​​术层面上,您可以使用解除引用构造来实现此目的 ${$NAME}

但请记住:

  • 这样做是不好的做法.

    除非你有一个非常好的技术原因,为什么你不能像上面那样起诉hashrefs的哈希值,否则不要这样做.

  • 在" use strict"(你应该总是使用)下,你不允许使用字符串作为参考:

    # WORKS without use strict
    $ perl -e 'our %h=(1=>2); print ${"h"}{1}' 
    
     2
    
    # use strict prohibits that:
    $ perl -e 'use strict; use warnings; our %h=(1=>2); print ${"h"}{1}'
    Can't use string ("h") as a HASH ref while "strict refs" in use 
    
    # but you can unfix by relaxing "strict refs":
    perl -e 'use strict; use warnings; \
        { no strict "refs"; our %h=(1=>2); print ${"h"}{1}; use strict "refs";}'
     2
    
    Run Code Online (Sandbox Code Playgroud)