Как мне разобрать строку с помощью GetOpt::Long:: GetOptions ?

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

  •  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.

Обязательный POSIXLY_CORRECT анекдот.

Похоже, что методы GetOptionsFromArray и GetOptionsFromString были добавлены только в версии 2.36, и, как сказал бы Мерфи, у меня только версия 2.35.

На данный момент, я думаю, мне придется жить с местным @ARGV.

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