Да, поскольку я только что понял, как это сделать сам, так как я хотел принять аргумент - #, а Getopt :: Long не принимает регулярное выражение для имени опции.Вот что я сделал:
use Getopt::Long qw(:config pass_through);
my $ret=GetOptions(
\%gops,
'lines|l', # lines/records to display
... cut ...
'<>' => \&filearg, # Handle file names also attach current options
);
Затем я определил функцию filearg ():
sub filearg {
my $arg=shift;
# First see if it is a number as in -20 as shortcut for -l 20
if ($arg =~ /^--?(\d)+$/) {
$gops{'lines'}=$1;
} elsif (-f "$arg" && -r "$arg") {
my %ops=%gops;
$fops{$arg}=\%ops;
push(@files, $arg);
} else {
push(@badargs, $arg);
}
return(undef);
}
Итак, что нужно, так это опция pass_through, проверка того, что вы хотите, иустановка этих вещей, когда видно.Выше у меня были неопределенные опции, переданные моей функции.Я использую это для проверки файлов и для специальной опции - # где # - некоторое целое число.Если он не совпадает, я добавляю в массив badargs, так как это не приведет к сбою GetOptions, поэтому я должен проверить этот массив после возврата из GetOptions, чтобы увидеть, были ли обнаружены ошибки.Вы также можете завершить его при ошибке опции, завершив функцию обратного вызова с помощью die("!FINISH");
, что заставит GetOptions завершить сценарий.
Для чего я использую, это возможность иметь что-то вроде -20 FILE1 -30FILE2, поэтому параметры могут быть переопределены для последующих файлов.Я вижу, что вы можете сделать что-то подобное с проверкой первой части имени опции, а затем значения.Поэтому, если все ваши опции начинаются с --resource
, найдите в своей функции нечто подобное: /^--?(resource\w+)=(.*)$/
, а затем добавьте в массив опций.
В любом случае, надеюсь, это поможет.