Perl Getopt::Длинные вспомогательные пробелы для аргументов

#perl #getopt-long

#perl #getopt-длинный

Вопрос:

У меня есть скрипт на Perl, который использует GetOpts long. Подобная команда легко обрабатывается:

 automate -action build,deploy -modules chat,email,login 
  

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

Например

 automate -action build, deploy   -modules chat, email, login
  

Проблема в том, что GetOpt::Long внутренне используется @ARGV для установки переменных по мере необходимости, а пробел изменяет @ARGV массив, который, в свою очередь, помещает только ‘build’ в качестве действия и только ‘chat’ в качестве модуля для скрипта, игнорируя остальные переданные аргументы.

Существует ли простой способ синтаксического анализа командной строки, подобный приведенному выше в Perl?

Я надеюсь, что есть, потому что в противном случае мне придется использовать очень хакерский способ изменения @ARGV массива перед его передачей в GetOpts.

Существуют ли какие-либо другие надежные библиотеки, которые сделают это за меня?

—————————Сценарий, созданный на заказ———————————

 GetOptions("action=s{1,4}"=>@myactions,
            "modules=s{,}"=>@mymodules);

foreach(@mymodules)
{
      if($_ eq $mymodules[0])
      {
          $mymodules= $mymodules.$_;
          next;
      }
      if($dashboards =~ m/,$/ || $_ =~ m/^,/)
      {
          $mymodules= $mymodules.$_;
      }
      else
      {
          $mymodules= $mymodules.",".$_;
      }
}
  

Комментарии:

1. это не очень хорошая идея — наличие списков аргументов, разделенных пробелами, противоречит большинству стандартов CLI UI. Вы никогда не должны отклоняться от того, с чем знакомо большинство пользователей при разработке пользовательских интерфейсов (включая интерфейсы командной строки) без очень веской причины

2. Обратите внимание, что вы можете нормализовать @ARGV любым удобным вам способом перед вызовом GetOptions. Но это очень плохая идея, поскольку люди не ожидают такого интерфейса.

Ответ №1:

Ознакомьтесь с разделом Параметры с несколькими значениями в Getopt::Long perldoc . Похоже на то, что вы ищете.

Пример:

     GetOptions ("action=s{,}" => @valuelist);
    @values = split(/[s,] /,join(',' , @valuelist));

    # @values will contain the list of values passed to the option.
    # This can handle the scenarios:
    # <command> -action build,deploy
    # <command> -action build, deploy
    # <command> -action build deploy
  

Комментарии:

1. Да, я это уже проверил. Это позволит мне разделять данные только пробелами, запятые по умолчанию не будут являться частью аргумента… Тем не менее, я разработал свой собственный скрипт для выполнения этого, пожалуйста, дайте мне знать, если в этом есть какие-либо подводные камни .. это было бы большим подспорьем. Когда-нибудь я обновлю свой вопрос.

2. @Neeraj — Да, вы правы. По умолчанию несколько значений разделяются пробелами. Но, если вы решите использовать разделитель, разве вы не можете разделить, чтобы получить список передаваемых значений ? На всякий случай я дополнил свой ответ решением, которое имел в виду …

3. Ответ, который вы опубликовали, я уже реализовал в коде. Но только более совершенная, расширенная версия. Я добавил скрипт в ответ. Скрипт даже разрешает такие вещи, как —action deploy , package. Сценарий, который вы опубликовали, в конечном итоге выдаст строку с неправильными значениями, поскольку ‘deploy’ ‘,’ ‘package’ будут приниматься как три разных аргумента.

Ответ №2:

Это нестандартное использование командной строки, поэтому вам понадобится нестандартный анализатор командной строки. В списке есть около 180 отдельных записей, если вы выполните поиск по ‘getopt’ в http://search.cpan.org /, так что есть из чего выбирать.

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

Вы бы настаивали на запятых в конце? Это кажется неуклюжим для этого. Я вижу:

 automate -action build deploy -modules chat email login
  

Требовать запятых в конце некоторых аргументов было бы странно.

Вам нужно будет рассмотреть, имеет ли параметр с двойным тире особое значение, и имеет ли параметр с одним тире особое значение:

 somecmd -f - --
  

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

Комментарии:

1. Обратите внимание, что с обозначением automate -action build, deploy -modules chat, email, login оболочка отвечает за передачу 8 аргументов automate скрипту; с обозначением automate -action build,deploy -modules chat,email,login оболочка передает всего 5 аргументов. Вероятно, вы могли бы использовать automate -action "build, deploy" -modules "chat, email, login" в командной строке; по крайней мере, вы получите только 5 аргументов скрипта, и вы можете разделить аргументы, содержащие пробелы. Я придерживаюсь наблюдения, что желаемое использование необычно и обычно не поддерживается.