Вставьте и используйте неизвестные параметры в GetOptions - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь создать скрипт (написанный на Perl), который получает аргументы.Вызов должен выглядеть следующим образом:

./script [action] --option1 --option2 ... --optionK 

Для этого я использую модуль GetOptions:Long.Также я использую $ARG[0], чтобы получить действие.Пример:

./script report --color black --version 19.4

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

./script report --color black --version 19.4 more and more --info 551_5 from --the user

Я хотел бы проанализировать этот массив @ARGV ивставьте дополнительную информацию в переменную:

$additional = "more and more --info 551_5 from --the user"

Я обнаружил, что после использования GetOptions он удалит эти параметры (не включая $ARGV[0]) из массива @ARGV.Проблема в том, что я действительно не знаю, как получить дополнительную информацию из массива.Может быть, я должен добавить дополнительную опцию, что-то вроде этого:

./script report --color black --version 19.4 --additional more and more --info 551_5 from --the user

И получить все в additional.Но в этом случае у меня есть другая проблема - он будет обрабатывать --info и --the в качестве аргументов.

Как мне решить эту проблему?

EDIT :Я видел, что pass_through можно использовать.Но что, если у пользователя есть опция, похожая на одну из моих доступных?Это может сделать некоторые проблемы.Можно ли справиться с этим так же, как строка?Также таким образом мне придется проанализировать @ARGV и удалить $ARGV[0] (действие).

EDIT-2 : метод -- будет работать.Но мне кажется, что это обходной путь, а не правильный способ решения этой проблемы.Должен быть более чистый способ сделать это.Может быть, поменять на другой модуль?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Как говорит @Ujin, -- прекратит обработку аргументов в этой точке списка аргументов.Другой вариант, который вы почти получили, это использование --additional.Это будет работать, если вы заключите следующий текст в кавычки, ' для unix / linux и " для Windows.Это заставит оболочку думать, что весь текст после --additional, в кавычках, является одним элементом для передачи в @ARGV.Затем GetOptLong правильно увидит more and more --info 551_5 from --the user в качестве параметра для опции --additional.Это делает вашу командную строку похожей на

./script report --color black --version 19.4 --additional 'more and more --info 551_5 from --the user'
0 голосов
/ 25 октября 2018

Вы можете использовать -- для разделения дополнительных аргументов: ./script --option1 --option2 -- --userOption1 --userOption2

https://metacpan.org/pod/Getopt::Long#Mixing-command-line-option-with-other-arguments

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...