GetOptions() в perl не проверяет полные имена аргументов

Предположим, я хочу ввести 2 параметра командной строки — источник и пункт назначения. GetOptions разрешает командную строку, проверяя только первый символ имени аргумента вместо полной строки. Как проверить полные строки аргументов, а не просто разрешить передачу их подстрок?

Вот пример программы:

my ($source,$dest);
GetOptions(
'from=s' => \$source,
'to=s' => \$dest
) or die "Incorrect arguments\n";

Он принимает любой из:

  • -from
  • -fro
  • -fr
  • -f

  • -to

  • -t

Однако я хочу, чтобы он принимал только

  • -from
  • -to

и потерпеть неудачу, если будет передано что-либо, кроме этих полных слов.

Как я могу запретить сокращенные варианты?


person AK47    schedule 04.05.2017    source источник


Ответы (2)


По умолчанию сокращения включены. Отключить auto_abbrev. См. Getopt::Long:

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

my ($source,$dest);
GetOptions(
'from=s' => \$source,
'to=s' => \$dest
) or die "Incorrect arguements\n";

Например, когда передается -fro, это умирает с сообщением:

Unknown option: fro
Incorrect arguements
person toolic    schedule 04.05.2017
comment
Вместо этого я рекомендую use Getopt::Long qw( :config posix_default );; он обеспечивает более разумные значения по умолчанию, включая no_auto_abbrev. В частности, он эквивалентен use Getopt::Long qw( :config no_auto_abbrev no_getopt_compat require_order );, поэтому -fro не допускается, +from не допускается, а также не допускается смешивание параметров и аргументов. - person ikegami; 04.05.2017

См. раздел «Настройка Getopt::Long» в документации:

auto_abbrev

Разрешить сокращать имена опций до уникальности. По умолчанию включено, если не установлена ​​переменная среды POSIXLY_CORRECT, в этом случае "auto_abbrev" отключена.

person choroba    schedule 04.05.2017