Perl Getopt::Long
позволяет разработчику добавлять в скрипт свои собственные параметры. Также можно разрешить несколько значений параметра с помощью использования спецификатор повторения, как это видно в регулярных выражениях. Например:
GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);
Кроме того, значения параметров можно хранить в хеше. вот так:
my %h = ();
GetOptions(\%h, 'length=i'); # will store in $h{length}
Что я пытаюсь сделать, так это объединить эти два метода, чтобы получить хэш моих опций, даже если они имеют несколько значений.
Например, я хочу разрешить три параметра: день рождения (три целых числа), родители (одна или две строки), имя (ровно одна строка). Допустим также, что я хочу поместить эти значения в хэш. Я пробовал следующее:
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]
};
Если бы «эллен» была бы в массиве или если бы все было внутри хэша, это тоже было бы хорошо.
Разве нельзя объединить эти две функции Getopt::Long
, т.е. поместить параметры в хэш и использовать спецификаторы повторения?