Как мне разобрать строку с помощью GetOpt::Long:: GetOptions ?
-
02-07-2019 - |
Вопрос
У меня есть строка с возможными аргументами командной строки (с использованием программы Read-Eval-Print-Loop), и я хочу, чтобы она анализировалась аналогично аргументам командной строки при передаче в Getopt::Long.
Разработать:
У меня есть строка
$str = '--infile /tmp/infile_location --outfile /tmp/outfile'
Я хочу, чтобы он был проанализирован GetOptions, чтобы мне было легче добавлять новые параметры.
Один из обходных путей, который я мог придумать, - это разбить строку на пробелы и заменить @ARGV новым массивом, а затем вызвать GetOptions.что - то вроде ...
my @arg_arr = split (/\s/, $input_line);
# This is done so that GetOptions reads these new arguments
@ARGV = @arg_arr;
print "ARGV is : @ARGV\n";
GetOptions (
'infile=s' => \$infile,
'outfile=s' => \$outfile
);
Есть ли какой-нибудь хороший / улучшающий способ?
Решение
Ознакомьтесь с разделом параметры синтаксического анализа из произвольной строки в справочная страница для Getopt::Длинная, Я думаю, это делает именно то, что вы ищете.
Другие советы
Вместо разделения по пробелам используйте встроенную функцию glob.В дополнение к разделению по пробелам, это выполнит стандартные расширения командной строки, а затем вернет список.(Например, * предоставил бы список файлов и т.д.) Я бы также рекомендовал локализовать @ARG по общему принципу.
Кроме этого, это единственный способ, которым вы можете это сделать, не переписывая GetOptions. (Очевидно, мне нужно более внимательно ознакомиться с документацией.)
Ух ты!!!
Я думаю, что могу использовать оба ответа бентилли и диномайта и сделать следующее:
- используйте glob для выполнения стандартных расширений командной строки
- передайте массив после glob в метод GetOptionsFromArray метода GetOpt::Long (см. здесь)
Код может выглядеть примерно так ...
GetOptionsFromArray ([glob ($input_line)]);
И это только одна строка ..круто (я знаю, что мне нужно выполнить некоторую проверку на ошибки и т.д.)..но это круто ...
Когда вы используете Getopt::Long для чего-то другого, кроме пользовательского ввода, имейте в виду, что некоторые функции отличаются в зависимости от переменной окружения POSIXLY_CORRECT.Вы можете переопределить это с помощью соответствующего вызова Configure.
Похоже, что методы GetOptionsFromArray и GetOptionsFromString были добавлены только в версии 2.36, и, как сказал бы Мерфи, у меня только версия 2.35.
На данный момент, я думаю, мне придется жить с местным @ARGV.