2016-03-04 3 views
3

Я работаю над программой perl (perl 5.8). Эта программа использует аргументы командной строки для своих входов. Проблема, с которой я сталкиваюсь, заключается в следующем: я использую несколько аргументов командной строки. .Несколько аргументов командной строки в perl, когда один аргумент ошибочно принимает другой аргумент как его значение

tool -f "arg1_val" -p "arg2_val" 

Но в тех случаях, когда пользователь забывает указать значение сказать

tool -f -p "arg2_val" 

Вместо erroring, оно предполагает -f = -p

Я использую Getopt::Long и процедура GetOptions

GetOptions ("f=s" => \$opt_f, 
      "p=s" => \$opt_p, 
      ); 
+0

Хорошая [статья о Getopt :: Long] (http://perltricks.com/article/195/2015/10/21/Professional-scripts-are-a-snap-with-Getopt-- Длинный/). – jreisinger

ответ

0

Какая ошибка вы ожидаете? Опция -f имеет аргумент, а параметр -p не указан. Вы должны обращаться с обязательными или дополнительными опциями себя:

die "Missing -p\n" unless defined $opt_p; 
die "Missing -f\n" unless defined $opt_f; 
die "Extra arguments @ARGV\n" if @ARGV; 
4

Вы должны использовать : вместо =.

Вы должны проверить «Сводка спецификаций опций» в Getopt::Long. Это от GetOptions.

=s: Опция принимает обязательный строковый аргумент. Эта строка будет назначена переменной опции. Обратите внимание, что даже если строковый аргумент начинается с - или -, он не будет рассматриваться как опция для себя.

:s: Опция принимает необязательный строковый аргумент. Эта строка будет равна , назначенной переменной опции. Если опущено, ему будет присвоено значение «» (пустая строка). Если аргумент строки начинается с - или -, то он будет считать опцией .

Ниже следует работать. Если вы опустите какой-либо аргумент, соответствующая переменная будет назначена "".

GetOptions ('f:s' => \$opt_f, 
      'p:s' => \$opt_p, 
      ) or die("Error in command line arguments\n"); 

# later you can check for argument variable if any option is mendatory for you. 
die "No value passed to -f\n" unless($opt_f); 
+1

Это гвозди. Я совершенно забыл разницу. – zdim

+0

Спасибо, что сообщили мне о разнице. В большинстве документов разница между = s и: s объясняется только с точки зрения необязательного/необязательного. Но важно помнить - «шляпа, даже если строковый аргумент начинается с - или -, он не будет считаться опцией сам по себе» –

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