我试图读取散列的值,其名称和索引存储在一个字符串中.我只能获得值,如果我硬编码哈希及其索引,但不是如果我从另一个变量.为了更好地描述它,我已经提到了以下代码:
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'}"值)
首先,您应该避免将此作为技术方法.
如果需要按名称动态获取一组哈希值,那么正确的解决方案(来自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)