Может ли Perl Getopt::Long анализировать аргументы, которые я не определил заранее?

StackOverflow https://stackoverflow.com/questions/529868

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

А 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 для анализа специальных вариантов.

Другие советы

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

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

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

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

Потенциально вы можете использовать "Опции с хэш-значениями" особенность.

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

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 будет иметь значение, связанное с «фильтром».

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

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

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

Специальная опция «имя» <> может использоваться для обозначения подпрограммы для обработки аргументов, не являющихся опциями.Когда 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.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top