使用Config :: General Perl模块脚本正在从配置文件加载数据。但是如果文件中有重复的条目,我得到一个带有数组值的哈希键,但我只想要键和值对。想要删除重复的值。
my $conf_data = new Config::General(-ConfigFile => $hash{config_file},
-InterPolateEnv => 1,
-UseApacheInclude => 1,
-IncludeRelative => 1,
);
my %conf_data = $conf_data->getall;
以下是我得到的哈希结构: 文件输入
key = AMC
key = AMC
key1 = TEST1
key2 = TEST2
输出
'key' => [
'AMC',
'AMC'
],
'key1' => 'TEST1',
'key2' => 'TEST2',
但我希望得到这样的结论:
'key' => 'AMC',
'key1' => 'TEST1',
'key2' => 'TEST2',
答案 0 :(得分:2)
要直接使用Config :: General执行此操作,您需要the -MergeDuplicateOptions
option。
如果设置为true值,则将合并重复选项。这意味着,如果同一选项出现多次,则最后一个选项将用于生成的配置哈希。
如果你想要的只是用数组的最后一个值替换数组,你只需要迭代和替换。
use warnings;
use strict;
my %conf_data = (
'key' => [ 'AMC', 'AMC' ],
'key1' => 'TEST1',
'key2' => 'TEST2',
);
foreach my $key (keys %conf_data) {
if ( ref $conf_data{$key} && ref $conf_data{$key} eq 'ARRAY' ) {
$conf_data{$key} = $conf_data{$key}->[-1];
}
}
use Data::Printer;
p %conf_data;
输出:
{
key "AMC",
key1 "TEST1",
key2 "TEST2"
}
如果您不介意安装其他模块,也可以使用Ref::Util执行此操作。它是用XS编写的,速度非常快。如果你对它的工作原理感兴趣,这里是SawyerX给出的关于at the German Perl Workshop 2016的讨论,几个月之后再次at YAPC::NA 1 。
use Ref::Util 'is_arrayref';
foreach my $key (keys %conf_data) {
$conf_data{$key} = $conf_data{$key}->[-1]
if is_arrayref($conf_data{$key});
}
1)有趣的是,他穿着同样的T恤