Один из способов - присвоить хэшу параметры формата key=value
, что GetOpt :: Long позволяет .Еще лучше, поскольку для этой функции просто нужна ссылка на хеш, оказывается, что вы можете назначить ее хэш-ссылке, которая является значением внутри более глубокой структуры данных.Вы можете напрямую использовать это
use warnings;
use strict;
use feature 'say';
use Getopt::Long;
use Data::Dump qw(dd);
my %args;
$args{multi} = {};
GetOptions( 'multi=s' => $args{multi} ) or die "Bad options: $!";
dd \%args;
. При многократном вызове этой опции пары ключ-значение добавляются
script.pl --multi k1=v1 --multi k2=v2
, и вышеприведенная программа печатает
{ multi => { k1 => "v1", k2 => "v2" } }
Я использую Data :: Dump для печати сложных данных.Перейдите на ядро Data::Dumper
, если это проблема.
Хотя Getopt::Long
позволяет ограничить число аргументов, принимаемых опцией, которые, очевидно, применимы только для адресатов массива.Таким образом, вам нужно посчитать количество ключей для проверки.
Другой способ - обработать строку ввода в подпрограмме , где вы можете делать практически все, что захотите.Добавление этого к вышеупомянутому сценарию, чтобы добавить еще один ключ с его хеш-значением к %args
use warnings;
use strict;
use feature 'say';
use Getopt::Long;
use Data::Dump qw(dd);
my %args;
$args{multi} = {};
GetOptions(
'multi=s' => $args{multi},
'other=s' => sub { $args{other} = { split /[=,]/, $_[1] } }
) or die "Bad options: $!";
dd \%args;
Когда вызывается как
script.pl --multi k1=v1 --multi k2=v2 --other mk1=mv1,mk2=mv2
Это печатает
{
other => { mk1 => "mv1", mk2 => "mv2" },
multi => { k1 => "v1", k2 => "v2" },
}