我正在尝试读取散列的值,它的名称和索引存储在一个字符串中。只有对散列及其索引进行硬编码,才能获得该值,但如果从另一个变量获取,则无法获得该值。为了更好地描述它,我提到了下面的代码:
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";我想使用${$Reference}打印SystemUser{'Password'}的值(具有$Reference = "SystemUser{'Password'}"值)
发布于 2012-08-27 23:09:43
首先,您应该避免将此作为一种技术方法。
如果需要通过名称动态获取一组散列中的一个,正确的解决方案(来自Java world的模式)是将散列存储在散列引用的散列中;外部散列的键是各个散列名称应该是的:
my %users = (
SystemUser => {
Username => "system",
Password => "system"
}
,GuestUser => {
Username => "xxx",
Password => "xxx"
}
);
print "$users{SystemUser}->{Password}";在技术层面上,您可以使用取消引用构造${$NAME}来完成此操作
但是,请记住:
这样做,
除非你有一个非常好的技术理由,为什么你不能像上面那样起诉哈希引用,否则就不要这么做。
use strict“下(你应该一直使用),你根本不允许使用字符串作为引用:WORKS use use strict$ perl -e 'our %h=(1=>2);print ${"h"}{1}‘2# use strict禁止:$ perl -e 'use strict;use warnings;our %h=(1=>2);print ${"h"}{1}‘在使用"strict refs“时不能将字符串("h")用作哈希引用,但您可以通过放松"strict refs”来解除修复: perl -e 'use strict;use warnings;\{ no strict "refs";our %h=(1=>2);print ${"h"}{1};use strict "refs";}’2发布于 2012-08-27 23:10:43
${}只能返回值本身-即散列,下一对{}中的索引必须保留在外部。
my $Reference = "SystemUser";
my $Field = 'Password';
print "Reference value : ${$Reference}{$Field}\n";尽管如此,通过命名引用访问全局变量在Perl中仍然是一种糟糕的做法。您最好使用散列的散列。
发布于 2012-08-27 23:29:13
如果您所说的"0硬编码“是指所有东西都是参数化的,那么您实际上无法做到这一点:程序必须至少做一些假设
但是,将大多数数据设置为可配置是很实用的,尽管这样做的方法不是将Perl代码存储在配置文件中
SystemUser{'Password'}是Perl代码,您的配置文件应该只包含数据
但是你可以这样写,例如
use strict;
use warnings;
my %config = (
SystemUser => {
Username => 'system',
Password => 'system'
}
);
while (<DATA>) {
my ($domain, $field) = split;
print "Value: $config{$domain}{$field}\n";
}
__DATA__
SystemUser Password输出
Value: systemhttps://stackoverflow.com/questions/12144511
复制相似问题