【问题标题】:Slicing key-value pairs from a hash of hashes in Perl从 Perl 中的哈希值中切分键值对
【发布时间】:2015-06-29 15:23:18
【问题描述】:

我正在使用 AppConfig 做一些工作,但为了方便起见,我希望选项数组有另一个数据元素(这里称为 'SWITCH')。

AppConfig 的 define() 函数的典型输入是 (string, hashref) 对的列表,例如

    "cfg" => { ALIAS => 'c',ARGS => "=s"},

现在,为了便于维护一个很长的配置选项列表,我用一个新键(称为“SWITCH”)扩展了它,我在程序执行期间使用它来做家务,在参数之后被处理。 示例:

source => { 
SWITCH => '/File',
ALIAS => "file",
ARGS => "=s",
},

AppConfig 当然不喜欢这样,如果遇到SWITCH 键就会产生错误。因此,在将选项列表传递给 define() 之前,我需要切出 SWITCH 及其每个选项的值。

按照前面的示例,结果将是:

source => { 
ALIAS => "file",
ARGS => "=s",
},

我有一些这样的代码(%qcfg 是一个包含define() 的选项列表的哈希;是的,我知道 AppConfig 将其视为一个列表,但将其用作哈希更容易,然后将其展平将列表传递给define()):

my %newcfg = map {
    my $hashref = $qcfg{$_};
    $_ => +{map ($_ => $hashref->{$_}, grep (!/^SWITCH$/, keys %{$hashref}))}
} keys %qcfg;

但是 %newcfg 出现时是一团糟,所以我没有做对。如何让它正确操作哈希?

【问题讨论】:

  • 我不太明白你的问题。你能举个更好的例子吗?

标签: perl hash


【解决方案1】:

我更改了您的线路:

$_ => +{map ($_ => $hashref->{$_}, grep (!/^SWITCH$/, keys %{$hashref}))}

到:

$_ => +{ map {$_ => $hashref->{$_}} grep (!/^SWITCH$/, keys %{$hashref}) }

我已经运行了它,它似乎工作 - 你觉得呢?

【讨论】:

  • 是的,确实有效。谢谢你。补充的问题是为什么使用块可以工作,而使用和 expr 不行?
  • 这是从 perldoc 中提取的:“ %hash = map +( lc($_) => 1 ), @ array # 这是 EXPR 并且有效!” - 看起来你需要括号括起来,如果你想使用 EXPR。 @mikb
【解决方案2】:

一种可能的方法是复制并删除不需要的密钥

use Storable qw(dclone);

my %newcfg = %{ dclone(\%qcfg) };           ## make a deep copy
for(keys %newcfg){
     delete $newcfg{$_}{SWITCH}             ## remode SWITCH
}

(未经测试!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多