использование Getopt::Std и Getopt::Long в сценарии Perl

У меня есть существующий сценарий Perl, в котором есть много параметров командной строки, которые обрабатываются с использованием Getopt::Std (функция getopts). Но я хочу добавить 2 новые опции: --testrun и --cfgarray.

Я использовал use Getopt::Long; и GetOptions('testrun' => \$test_flag); "--testrun" не принимает аргументов. Я просто использовал его как флаг, например if($test_flag). Работает при отдельном запуске. Но так как в моем Perl-скрипте есть и use Getopt::Long;, и use Getopt::Std;, я получаю сообщение об ошибке:

неизвестные варианты

из getopts API (когда он вызывается до GetOptions). Можно ли использовать и Getopt::Std, и Getopt::Long в одном Perl-скрипте?


person Jaya Surya S Athikesavan    schedule 02.07.2018    source источник


Ответы (2)


Getopt::Std и Getopt::Long оба просто интерпретируют @ARGV , поэтому, если вы повозитесь с этим, теоретически можно использовать их оба в одном скрипте или вызывать GetOptions более одного раза. Однако я бы не рекомендовал это делать — просто используйте Getopt::Long.

Этот код:

use Getopt::Std;
getopts('a:b', \my %opts) or die "Bad options\n";

можно перевести на:

use Getopt::Long;
GetOptions(\my %opts, 'a=s', 'b') or die "Bad options\n";

а затем вы можете добавить дополнительные параметры и длинные параметры. Здесь я добавил короткий псевдоним -t для опции --testrun просто для демонстрации:

use Getopt::Long;
GetOptions(\my %opts, 'a=s', 'b',
    'testrun|t', 'cfgarray' ) or die "Bad options\n";
person haukex    schedule 02.07.2018

Насколько я знаю, вы не можете использовать оба варианта, но Getopt::Long также поддерживает короткие варианты, так что вы можете придерживаться.

person marderh    schedule 02.07.2018
comment
хорошо спасибо. Затем я хочу использовать GetOptions для выполнения getopts(yjfei:o:j:z:, \%opts); . В GetOptions (Getopt::Long;) можем ли мы передавать аргументы в хэш? и в то же время я хочу получить некоторые значения в массив. (как я уже упоминал в вопросе. Можем ли мы сделать и то, и другое?) Я также прочитал, что мы не можем вызывать GetOptions более одного раза в программе. не могли бы вы привести пример использования GetOptions для получения getopts(yjfei:o:j:z:, \%opts) в этот хеш-opts. а также получить 3 целых числа в массив. Заранее спасибо. - person Jaya Surya S Athikesavan; 02.07.2018
comment
Пожалуйста, взгляните на Getopt::Long! Это все есть: например. Сохранение значений опций в хеше или Параметры с несколькими значениями - person marderh; 02.07.2018