在散列中添加Getopt :: Long选项,即使使用重复说明符也是如此

Bra*_*roy 3 perl hash getopt-long

Perl Getopt::Long允许开发人员将自己的选项添加到脚本中.通过使用重复说明符,也可以为选项允许多个值,如正则表达式中所示.例如:

GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);
Run Code Online (Sandbox Code Playgroud)

此外,选项值可以存储在散列中,如下所示:

my %h = ();
GetOptions(\%h, 'length=i');    # will store in $h{length}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,结合这两种方法最终得到我的选项的哈希值,即使它们有多个值.

举个例子,假设我想允许三个选项: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);
Run Code Online (Sandbox Code Playgroud)

并测试了它,但输出如下:

perl optstest.pl --bday 22 3 1986 --parents john mary --name ellen
$VAR1 = {
    'name' => 'ellen',
    'parents' => 'mary',
    'bday' => 1986
};
Run Code Online (Sandbox Code Playgroud)

实际上只在哈希中使用每个选项的最后一个值.但我想要的是:

$VAR1 = {
    'name' => 'ellen',
    'parents' => ['mary', 'john'],
    'bday' => [22, 3, 1986]
};
Run Code Online (Sandbox Code Playgroud)

如果'ellen'将在一个数组中,或者如果所有内容都在一个哈希中,那也没关系.

是不是可以将这两个功能结合起来Getopt::Long,即将选项放在哈希中并使用重复说明符?

pal*_*lik 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);
Run Code Online (Sandbox Code Playgroud)

那是你要的吗?

$VAR1 = { 
          'bday' => 1986,
          'name' => [ 
                      'ellen'
                    ],
          'parents' => [ 
                         'john',
                         'mary'
                       ]
        };
Run Code Online (Sandbox Code Playgroud)