首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在perl中,如何获取散列值,其散列名存储在字符串中?

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

Stack Overflow用户
提问于 2012-08-27 22:57:59
回答 3查看 136关注 0票数 0

我正在尝试读取散列的值,它的名称和索引存储在一个字符串中。只有对散列及其索引进行硬编码,才能获得该值,但如果从另一个变量获取,则无法获得该值。为了更好地描述它,我提到了下面的代码:

代码语言:javascript
复制
    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'}"值)

EN

回答 3

Stack Overflow用户

发布于 2012-08-27 23:09:43

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

如果需要通过名称动态获取一组散列中的一个,正确的解决方案(来自Java world的模式)是将散列存储在散列引用的散列中;外部散列的键是各个散列名称应该是的:

代码语言:javascript
复制
my %users = (
     SystemUser => {
            Username => "system",
            Password => "system"
     }
    ,GuestUser => {
            Username => "xxx",
            Password => "xxx"
     }

);
print "$users{SystemUser}->{Password}";

在技术层面上,您可以使用取消引用构造${$NAME}来完成此操作

但是,请记住:

这样做,

  • It是不好的做法。

除非你有一个非常好的技术理由,为什么你不能像上面那样起诉哈希引用,否则就不要这么做。

  • 在"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
票数 6
EN

Stack Overflow用户

发布于 2012-08-27 23:10:43

${}只能返回值本身-即散列,下一对{}中的索引必须保留在外部。

代码语言:javascript
复制
my $Reference = "SystemUser";
my $Field = 'Password';

print "Reference value : ${$Reference}{$Field}\n";

尽管如此,通过命名引用访问全局变量在Perl中仍然是一种糟糕的做法。您最好使用散列的散列。

票数 2
EN

Stack Overflow用户

发布于 2012-08-27 23:29:13

如果您所说的"0硬编码“是指所有东西都是参数化的,那么您实际上无法做到这一点:程序必须至少做一些假设

但是,将大多数数据设置为可配置是很实用的,尽管这样做的方法不是将Perl代码存储在配置文件中

代码语言:javascript
复制
SystemUser{'Password'}

是Perl代码,您的配置文件应该只包含数据

但是你可以这样写,例如

代码语言:javascript
复制
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

输出

代码语言:javascript
复制
Value: system
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12144511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档