Странная обработка getopt = s? - PullRequest
0 голосов
/ 03 апреля 2012

код:

#!/usr/bin/env perl
use strict;
use warnings;
use locale;

my $prepinac_r = '';
my $array_name = '';

use Getopt::Long;
Getopt::Long::Configure ("bundling");
my $result = GetOptions(
"r=s" => \$prepinac_r,
"array-name=s" => \$array_name);

print STDERR "r: $prepinac_r\n";
print STDERR "array_name: $array_name\n";

работает:

script.pl --array-name=kokos -r=kure

вывод:

r: =kure
array_name: kokos

Что я делаю не так?Что я упустил?Почему -r получает "= kure" вместо "kure"?Пожалуйста, помогите ...

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

Вы смешиваете короткий и длинный синтаксис формы. Синтаксис краткой формы не использует =, поскольку это сделает его менее коротким.

"a|all"       => \$opt_all,
"e|execute=s" => \$opt_execute,

Сокращенная форма:

-aefoo
-a -efoo
-a -e foo

Длинная форма:

--all --execute=foo
--all --execute foo

Вот пример краткой формы, с которой вы, возможно, знакомы:

perl -le'print "Hello World";'
perl -l -e'print "Hello World";'
perl -l -e 'print "Hello World";'
1 голос
/ 03 апреля 2012

г.Студент, вы должны использовать двойной - для обоих переключателей >>

script.pl --array-name=coconut --r=chicken

...

r: chicken
array_name: coconut
0 голосов
/ 03 апреля 2012

Я полагаю, что поведение, которое вы видите, происходит из-за "связывания".

С Getopt :: Long

Enabling this option will allow single-character options to be bundled. To distinguish bundles from long option names, long options must be introduced with -- and bundles with -

Так что, если вы используете «комплектацию», то -

--array-name=foo --r=bar # Works
-afoo -rbar              # Also works

--array-name=foo -r=bar  # Does not. as you've already seen

Также не имеет смысла использовать связывание, если вы не используете опции, которые не требуют параметра, и поэтому могут быть «объединены»

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