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

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

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


person Jagmal    schedule 22.09.2008    source источник


Ответы (5)


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

person Drew Stephens    schedule 23.09.2008

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

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

person user11318    schedule 23.09.2008

Ух ты!!!

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

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

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

GetOptionsFromArray ([glob ($input_line)]);

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

person Jagmal    schedule 23.09.2008
comment
Первый аргумент — это ссылка на массив, поэтому вы хотите, чтобы GetOptionsFromArray([glob($input_line)],...) - person Michael Carman; 23.09.2008

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

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

person ysth    schedule 23.09.2008

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

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

person Jagmal    schedule 23.09.2008