Иногда, например, когда есть много опций, наличие отдельной переменной для каждой из них может быть громоздким.GetOptions()
поддерживает в качестве альтернативного механизма сохранение значений опций в хэше.
Чтобы получить это, в качестве первого аргумента GetOptions()
должна быть передана ссылка на хэш.Для каждой опции, указанной в командной строке, значение опции будет сохранено в хэше с именем опции в качестве ключа.Опции, которые в действительности не используются в командной строке, не будут помещены в хеш, другими словами, exists($h{option})
(или defined()
) можно использовать для проверки, использовалась ли опция.Недостатком является то, что предупреждения будут выдаваться, если программа работает под строгим использованием и использует $h{option}
без тестирования сначала с exists()
или defined()
.
my %h = ();
GetOptions (\%h, 'length=i'); # will store in $h{length}
Для параметров, которые принимают значения списка или хеш-значения,это необходимо указать, добавив знак @ или% после типа:
GetOptions (\%h, 'colours=s@'); # will push to @{$h{colours}}
Чтобы усложнить задачу, хеш может содержать ссылки на фактические места назначения, например:
my $len = 0;
my %h = ('length' => \$len);
GetOptions (\%h, 'length=i'); # will store in $len
Этот пример полностью эквивалентен:
my $len = 0;
GetOptions ('length=i' => \$len); # will store in $len
Возможна любая смесь.Например, наиболее часто используемые параметры могут храниться в переменных, а все остальные параметры хранятся в хэше:
my $verbose = 0; # frequently referred
my $debug = 0; # frequently referred
my %h = ('verbose' => \$verbose, 'debug' => \$debug);
GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i');
if ( $verbose ) { ... }
if ( exists $h{filter} ) { ... option 'filter' was specified ... }