从Perl中的哈希散列切片键值对

时间:2015-04-22 06:38:12

标签: perl hash

我正在使用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出现了乱七八糟的混乱,所以我没有做到这一点。如何让它正确操作哈希?

2 个答案:

答案 0 :(得分:0)

我改变了你的行:

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

为:

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

我已经运行它似乎有效 - 你怎么想?

答案 1 :(得分:0)

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

use Storable qw(dclone);

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

(未经测试!)