Perl的Getopt::Long
允许开发人员将自己的选项添加到脚本中。如正则表达式所示,use of a repeat specifier也可以为选项允许多个值。例如:
GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);
此外,option values can be stored in a hash,如此:
my %h = ();
GetOptions(\%h, 'length=i'); # will store in $h{length}
我要做的是,结合这两种方法最终得到我的选项的哈希,即使它们有多个值。
作为一个例子,假设我想允许三个选项:birthday(三个整数),parent(一个或两个字符串),first name(正好一个字符串)。 我们还要说我想将这些值放入哈希值。我尝试了以下方法:
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper;
my %h = ();
GetOptions(\%h, 'bday=i{3}', 'parents=s{1,2}', 'name=s{1}');
print Dumper(\%h);
并测试了它,但输出结果如下:
perl optstest.pl --bday 22 3 1986 --parents john mary --name ellen
$VAR1 = {
'name' => 'ellen',
'parents' => 'mary',
'bday' => 1986
};
在散列中实际只使用每个选项的最后一个值。但我想要的是:
$VAR1 = {
'name' => 'ellen',
'parents' => ['mary', 'john'],
'bday' => [22, 3, 1986]
};
如果'ellen'在一个数组中,或者如果所有内容都在一个哈希中,那也没关系。
是否无法将Getopt::Long
的这两个功能组合在一起,即将选项放入哈希并使用重复说明符?
答案 0 :(得分:6)
use Getopt::Long;
# enable for debugging purposes
# Getopt::Long::Configure("debug");
use Data::Dumper;
my %h = ();
GetOptions(\%h, 'bday=i{3}', 'parents=s@{1,2}', 'name=s@{1}');
print Dumper(\%h);
这就是你想要的吗?
$VAR1 = {
'bday' => 1986,
'name' => [
'ellen'
],
'parents' => [
'john',
'mary'
]
};
答案 1 :(得分:3)
如果你想要一个数组,你需要给它一个数组的引用。
local @ARGV = qw( --x y z );
my %h = ( x => [] );
GetOptions(\%h, 'x=s{2}');
print(Dumper(\%h));
或者你需要指定你想要一个数组。
local @ARGV = qw( --x y z );
GetOptions(\my %h, 'x=s@{2}');
print(Dumper(\%h));
输出:
$VAR1 = {
'x' => [
'y',
'z'
]
};
答案 2 :(得分:1)
您链接到的文档的Options with multiple values部分也说明了
警告:以下是一项实验性功能。
早些时候说过
GetOptions(\%h,'colors = s @'); #将推送到@ {$ h {colors}}
所以我猜这是作者的意图,它使用重复说明符以相同的方式工作,并且你发现了一个错误
我建议您使用属于Perl安装的perlbug
实用程序向Perl 5 Porters报告