Perl Getopt :: Long生成嵌套哈希

时间:2016-06-29 14:25:54

标签: perl getopt-long

我想使用Perl的Getopt :: Long包生成嵌套哈希。我想写的代码示例是:

my %settings;
GetOptions("set%=s%" => \%settings);

然后我想要这个命令行

myscript.pl --set-first a=b --set-first c=d --set-second e=f

在%settings中提供此值:

settings = {'first'  => {'a' => 'b',
                         'c' => 'd'},
            'second' => {'e' => 'f'}}

我目前正在使用下面的代码,但我想知道是否有更好的方法。

use Getopt::Long;
use Data::Dumper;

my %settings;

sub nested_hash_handler
{
    my ($option, $section, $rawvalue) = @_;
    my ($key, $value) = split(/=/, $rawvalue, 2);
    if (defined($value)) {
        $settings{$section}{$key} = $value;
    } else {
        print "$rawvalue is not a valid option setting for $option.  Ignoring.\n";
    }
}

GetOptions("set=s%" => \&nested_hash_handler);
print Data::Dumper->Dumper(\%settings);

更新

我用当前代码调用脚本的方式实际上是:

myscript.pl --set first=a=b --set first=c=d --set second=e=f

更新2

在安装某些软件(Perl-speaks-NONMEM)时将使用该代码。此Getopt代码的目的是在安装期间编辑配置文件;如果用户想要从命令行更改默认情况下不支持的任意设置,则可以。解析选项时,并不知道配置文件中的所有部分;用户可以在安装过程中添加或删除部分。所以,我不能先验地知道“第一”和“第二”应该是什么。最后,我希望这段代码能够在未经编辑的情况下保存到未来版本中,而不需要为每个版本更改部分进行编辑。

0 个答案:

没有答案