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