Как я могу разрешить неопределенные параметры при разборе аргументов с Getopt - PullRequest
19 голосов
/ 09 июня 2010

Если у меня есть командная строка вроде:

my_script.pl -foo -WHATEVER

Мой скрипт знает о --foo, и я хочу, чтобы Getopt установил переменную $opt_foo, но я ничего не знаю о -WHATEVER,Как я могу сказать Getopt разобрать параметры, о которых я говорил, а затем получить остальные аргументы в виде строковой переменной или списка?

Пример:

use strict;
use warnings;

use Getopt::Long;

my $foo; 

GetOptions('foo' => \$foo); 

print 'remaining options: ', @ARGV;

Затем, выдача

perl getopttest.pl -foo -WHATEVER

дает

Unknown option: whatever
remaining options:

Ответы [ 3 ]

23 голосов
/ 09 июня 2010

Вам необходимо настроить параметр «pass_through» через Getopt::Long::Configure("pass_through");

Затем он поддерживает фактические параметры (например, материал, начинающийся с «-» и без специального разделителя «-», чтобы обозначить конец «реального»)." опции).

Вот цитата perldoc :

  • pass_through (по умолчанию: отключено)

    Параметры, которые неизвестны, неоднозначны или поставляются сневерное значение опции передается в @ARGV вместо того, чтобы быть помечено как ошибка.Это позволяет писать сценарии-оболочки, которые обрабатывают только часть предоставленных пользователем аргументов командной строки, и передавать оставшиеся параметры другой программе.

Вот пример

$ cat my_script.pl
#!/usr/local/bin/perl5.8 -w

use Getopt::Long;
Getopt::Long::Configure("pass_through");
use Data::Dumper;
my %args;
GetOptions(\%args, "foo") or die "GetOption returned 0\n";
print Data::Dumper->Dump([\@ARGV],["ARGV"]);

$ ./my_script.pl -foo -WHATEVER          
$ARGV = [
          '-WHATEVER'
        ];
1 голос
/ 09 июня 2010

Разве оставшиеся (не разбранные) значения просто не остались в @ARGV?Если ваш дополнительный контент начинается с тире, вам необходимо указать конец списка опций с помощью --:

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper;

my $foo;
my $result = GetOptions ("foo"   => \$foo);
print Dumper([ $foo, \@ARGV ]);

Затем вызов:

my_script.pl --foo -- --WHATEVER

дает:

$VAR1 = [
          1,
          [
            '--WHATEVER'
          ]
        ];

PS.В MooseX :: Getopt «оставшиеся» опции из командной строки помещаются в атрибут extra_argv как arrayref - поэтому я бы порекомендовал преобразовать!

0 голосов
/ 09 июня 2010

Я думаю, что ответ здесь, к сожалению, таков: «Нет, нет способа сделать это в точности так, как вы просите, используя Getopt :: Long, без анализа @ARGV самостоятельно». Эфир имеет достойный обходной путь, хотя. Это особенность, поскольку большинство людей обеспокоены тем, что любой аргумент, подобный параметру, воспринимается как ошибка. Обычно вы можете сделать

GetOptions('foo' => \$foo) 
    or die "Whups, got options we don't recognize!";

для захвата / предотвращения передачи нечетных параметров, а затем вы можете исправить пользователя при использовании. Кроме того, вы можете просто пройти и игнорировать их.

...