使用Config :: Genral从Key中删除重复值

时间:2017-02-15 09:10:43

标签: perl

使用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',

1 个答案:

答案 0 :(得分:2)

使用Config :: General

进行操作

要直接使用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恤