【问题标题】:Perl multi dimensional hashesPerl 多维哈希
【发布时间】:2015-10-12 00:14:34
【问题描述】:

我有一个配置文件,下面是它包含的部分之一:

[EXCLUDE_LIST]
c1=A
c2=B|C
c3=A
c1=B

我有一个 perl 脚本,它包含一个从配置读取上述部分并检查配置中是否存在特定组 (cX) 的子程序。这个 sub 的输入参数是一个与配置文件绑定(使用 tie)的哈希。当我调试代码时,我试图显示 EXCLUDE_LIST 部分的所有内容,程序在显示 c1 值时打印了一些垃圾 ARRAY[memory_address]。这是因为 c1 有重复的条目。

我的问题:如果有任何重复条目,我如何在上述子项中包含验证逻辑以退出流程。

这是在我的脚本中访问配置部分条目的方式:

$cfg->{EXCLUDE_LIST}->{cX}

TIA。

【问题讨论】:

  • 请显示整个sub。我认为程序不会打印垃圾值,因为 c1 的重复条目
  • 您是否使用 CPAN 模块来处理您的配置文件?
  • 是的 Borodin,我正在使用 Config::IniFiles 模块。

标签: perl hash


【解决方案1】:

如果你告诉我们你用哪个模块来读取你的配置文件,或者它是定制软件(一个坏主意,因为那里已经有很多配置文件模块),那将有很大帮助,那么你应该告诉我们编码。如果没有这些信息,这个答案必须是(知情的)猜测

我怀疑,无论您使用什么来读取配置文件,都会通过存储给定键的所有不同值的 array 来处理重复条目。在您的情况下,$cfg->{EXCLUDE_LIST}{c1} 的值将是 ['A', 'B']

你可以通过检查哈希值是否是一个引用来处理这个问题,像这样

while ( my ($key, $val) = each %{ $cfg->{EXCLUDE_LIST} } ) {

    if ( ref $val ) {
        print "$key=", join(',', @$val), "\n";
    }
    else {
        print "$key=$val\n";
    }
}

我的问题:如果有任何重复条目,我如何在上述子项中包含验证逻辑以退出流程。

你可以做类似的测试,但die如果值是参考

die qq{Multiple occurrences of "$key"} if ref $val;

【讨论】:

  • 感谢鲍罗丁。这正是我今天在工作中实施的,它奏效了 :) 感谢您抽出时间回复。
猜你喜欢
  • 2012-09-06
  • 2015-01-17
  • 2014-05-27
  • 2011-12-10
  • 2011-04-11
  • 2013-12-04
  • 2018-02-25
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多