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