Как мне разобрать строку с GetOpt :: Long :: GetOptions? - PullRequest
7 голосов
/ 23 сентября 2008

У меня есть строка с возможными аргументами командной строки (с использованием программы 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
           );

Есть ли хороший / лучший способ?

Ответы [ 5 ]

15 голосов
/ 23 сентября 2008

Ознакомьтесь с разделом Параметры разбора произвольной строки на справочной странице для Getopt :: Long , я думаю, что это именно то, что вы ищете.

7 голосов
/ 23 сентября 2008

Вместо разделения на пробелы используйте встроенную функцию glob. В дополнение к разделению на пробелы, это сделает стандартные расширения командной строки, а затем вернет список. (Например, * дал бы список файлов и т. Д.) Я бы также порекомендовал локализовать @ARG по общему принципу.

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

5 голосов
/ 23 сентября 2008

Вау !!!

Я думаю, что могу использовать ответы как Бентилли, так и Диномита, и делать следующее:

  • использовать glob для выполнения стандартных расширений командной строки
  • передать массив после glob в метод GetOptionsFromArray метода GetOpt :: Long (см. здесь )

Код может выглядеть примерно так ...

GetOptionsFromArray ([glob ($input_line)]);

И это только одна строка ... круто (я знаю, что я должен сделать некоторые проверки ошибок и т. Д.) ... но это круто ...

0 голосов
/ 23 сентября 2008

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

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

0 голосов
/ 23 сентября 2008

Когда вы используете Getopt :: Long для чего-то другого, чем пользовательский ввод, помните, что некоторые функции отличаются в зависимости от переменной среды POSIXLY_CORRECT. Вы можете переопределить это с помощью соответствующего вызова Configure.

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

...