Как использовать метод Getopt :: Long? - PullRequest
3 голосов
/ 30 июня 2010

Как использовать метод Getopt :: Long , если выполнение входной команды выглядит следующим образом:

$ testcmd -option check  ARG1 ARG2 ARG3

или

$ testcmd  ARG1 ARG2 ARG3

Ответы [ 3 ]

4 голосов
/ 30 июня 2010

Вам необходимо включить опцию pass_through.Документация, приведенная ниже:

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

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

Если включен require_order, обработка параметров прекращается при первомнераспознанный вариант или не вариант, в зависимости от того, что наступит раньше.Однако, если вместо этого включен permute, результаты могут запутаться.

ДВК опубликовал пример того, как это сделать, в другом ответе.Сначала я бы проголосовал за его ответ, если вы найдете его полезным.

4 голосов
/ 30 июня 2010

Быстрый пример:

#! /usr/bin/perl

use warnings;
use strict;

use Getopt::Long;

sub usage { "Usage: $0 [--option=VALUE] ARG1 ARG2 ARG3\n" }

my $option = "default";

GetOptions("option=s", \$option)
  or die usage;

die usage unless @ARGV == 3;

print "$0: option=$option: @ARGV\n";

Getopt::Long достаточно гибок в том, что он примет:

$ ./cmd
Usage: ./cmd [--option=VALUE] ARG1 ARG2 ARG3

$ ./cmd 1 2 3
./cmd: option=default: 1 2 3

$ ./cmd --option=foo 4 5 6
./cmd: option=foo: 4 5 6

$ ./cmd -option=bar 7 8 9
./cmd: option=bar: 7 8 9

$ ./cmd -option check a b c
./cmd: option=check: a b c
1 голос
/ 03 ноября 2013
#!/usr/bin/perl

use Getopt::Long;

my $cla = GetOptions (  "one=s"         =>      \$one,
                        "two=s"         =>      \$two,
                        "three=s"       =>      \$three,
                        "help|h|?"      =>      \$help,
) or usage ();

if ($help) {
        usage ();
}

my $first = $one;
my $second = $two;
my $third = $three;

printf ("%-7s %-9s %-7s\n", $first, $second, $third);

sub usage {
        print "\n$0\t" . "[ -one <text> -two <text> -three <text> ]\n\n";
        exit (0);
}
...