Perl: использование GetOptions для фильтрации недопустимых параметров - PullRequest
4 голосов
/ 12 февраля 2012

Я работаю над небольшим скриптом на Perl, и у меня проблемы с параметрами из командной строки. Я использую GetOps для их анализа, как показано в коде ниже:

%params = (
  "help" => "",
  "no_inline" => "",
  "no_dupl" => ""
);

&paramError if (!GetOptions(
  "help" => \$params{"help"},
  "no-inline" => \$params{"no_inline"},
  "no-duplicates" => \$params{"no_dupl"},
));

Затем я запускаю скрипт так:

> script.pl --no-inline # ok, valid parameter
> script.pl --no-inline blahblah # blahblah is not valid
> script.pl --no-i # not valid

Проблема в том, что во втором и третьем примере GetOps говорит, что параметры действительны. Что я должен сделать, чтобы сделать эти параметры недействительными?

1 Ответ

6 голосов
/ 12 февраля 2012

Ваш третий пример действителен. GetOptions принимает сокращенные имена, если они не являются двусмысленными.
Если бы у вас был, например, параметр с именем no-indent, ваш третий пример был бы отклонен, поскольку он неоднозначен, но --no-inl все равно был бы принят.

Чтобы отключить это, используйте:

use Getopt::Long qw(:config no_auto_abbrev);

См. Настройка Getopt :: Long для других опций.

Ваш второй пример совершенно нормален. blahblah останется в @ARGV после вызова GetOptions. Если ваш сценарий принимает только те параметры, которые вы указали, и не может принимать другие аргументы (например, имена файлов или что-то еще), просто убедитесь, что @ARGV пусто после вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...