Могут ли Perl's Getopt :: Long анализировать аргументы, которые я не определяю заранее? - PullRequest
4 голосов
/ 09 февраля 2009

Я знаю, как использовать Perl Getopt :: Long, но я не уверен, как настроить его так, чтобы он принимал любую"--key = value" пару, которая не была явно определена вставьте это в хеш. Другими словами, я заранее не знаю, какие опции может пожелать пользователь, поэтому у меня нет возможности определить все из них, но я хочу иметь возможность проанализировать их все.

Предложения? Спасибо заранее.

Ответы [ 6 ]

12 голосов
/ 10 февраля 2009

Документация Getopt::Long предлагает вариант конфигурации, который может помочь:

pass_through (default: disabled)
             Options that are unknown, ambiguous or supplied
             with an invalid option value are passed through
             in @ARGV instead of being flagged as errors.
             This makes it possible to write wrapper scripts
             that process only part of the user supplied
             command line arguments, and pass the remaining
             options to some other program.

После анализа обычных параметров вы можете использовать код, такой как , предоставленный runrig для анализа специальных параметров.

5 голосов
/ 09 февраля 2009

Getopt :: Long этого не делает. Вы можете проанализировать параметры самостоятельно ... например,

my %opt;
my @OPTS = @ARGV;
for ( @OPTS ) {
  if ( /^--(\w+)=(\w+)$/ ) {
    $opt{$1} = $2;
    shift @ARGV;
  } elsif ( /^--$/ ) {
    shift @ARGV;
    last;
  }
}

Или измените Getopt :: Long для его обработки (или измените приведенный выше код, чтобы обрабатывать больше видов опций, если вам это нужно).

2 голосов
/ 10 февраля 2009

Я немного пристрастен, но в прошлом я использовал Getopt :: Что угодно для анализа неизвестных аргументов.

1 голос
/ 27 мая 2010

Потенциально вы можете использовать функцию " Опции со значениями хеша ".

Например, я хотел разрешить пользователям устанавливать произвольные фильтры при разборе массива объектов.

GetOptions(my $options = {}, 'foo=s', 'filter=s%')

my $filters = $options->{filter};

А потом назовите это как

perl ./script.pl --foo bar --filter baz=qux --filter hail=eris

Что бы построить что-то вроде ..

$options = {
          'filter' => {
                        'hail' => 'eris',
                        'baz' => 'qux'
                      },
          'foo' => 'bar'
        };

И, конечно, $ filters будет иметь значение, связанное с 'filter'

Удачи! Я надеюсь, что кто-то нашел это полезным.

0 голосов
/ 21 июля 2009

Из документации :

Аргумент Обратный вызов

Специальная опция 'name' <> может использоваться для обозначения подпрограммы для обработки неопционных аргументов. Когда GetOptions() встречает аргумент, который не похож на параметр, он немедленно вызывает эту подпрограмму и передает ей один параметр: имя аргумента.

Ну, на самом деле это объект, который переводится в имя аргумента.

Например:

my $width = 80; sub process { ... } GetOptions ('width=i' => \$width, '<>' => \&process);

Применительно к следующей командной строке:

arg1 --width=72 arg2 --width=60 arg3

Это вызовет process("arg1"), когда $width равно 80, process("arg2"), когда $width равно 72, и process("arg3"), когда $width равно 60

Эта функция требует настройки параметра permute, смотрите раздел "Настройка Getopt :: Long" .

0 голосов
/ 10 февраля 2009

Это хорошее время, чтобы запустить свой собственный парсер опций. Ни один из модулей, которые я видел в CPAN, не обеспечивает такой тип функциональности, и вы всегда можете взглянуть на их реализации, чтобы получить хорошее представление о том, как обрабатывать гайки и болты при разборе.

Кроме того, этот тип кода заставляет меня ненавидеть варианты Getopt:

use Getopt::Long;
&GetOptions(
    'name' => \$value
);

Непоследовательная капитализация сводит с ума, даже для людей, которые видели и использовали этот стиль кода в течение длительного времени.

...