2008-09-22 3 views
7

У меня есть строка с возможными аргументами командной строки (с использованием программы Read-Eval-Print-Loop), и я хочу, чтобы она анализировалась аналогично аргументам командной строки при передаче в Getopt :: Long.Как разобрать строку с GetOpt :: Long :: GetOptions?

Выработать:

У меня есть строка

$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 
      ); 

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

ответ

7

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

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

5

Wow !!!

Я думаю, что я могу использовать оба bentilly и dinomite ответов и сделать следующее:

  • использовать Glob выполнить стандартную командную строку РАЗЛОЖЕНИЙ
  • передать массив после Glob методы GetOptionsFromArray в Getopt :: Длинные (см here)

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

GetOptionsFromArray ([glob ($input_line)]); 

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

+0

Первый аргумент - ссылка на массив, поэтому вы хотите «GetOptionsFromArray ([glob ($ input_line)], ...)» – 2008-09-23 01:10:00

0

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

Obligatory POSIXLY_CORRECT anecdote.

0

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

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

Смежные вопросы