Как использовать метод Getopt::Long?
Как я могу использовать метод Getopt:: Long, если выполнение входной команды выглядит так:
$ testcmd -option check ARG1 ARG2 ARG3
или же
$ testcmd ARG1 ARG2 ARG3
3 ответа
Быстрый пример:
#! /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 Использование: ./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 -опция проверки abc./cmd: option = check: abc
Вам необходимо включить pass_through
вариант. Документация цитируется ниже:
pass_through
(по умолчанию: отключено)Параметры, которые неизвестны, неоднозначны или снабжены недопустимым значением параметра, передаются в @ARGV, а не помечаются как ошибки. Это позволяет писать сценарии-обертки, которые обрабатывают только часть предоставленных пользователем аргументов командной строки и передают оставшиеся параметры какой-либо другой программе.
Если
require_order
Если параметр включен, обработка параметров будет прекращена при первом нераспознанном параметре или без него, в зависимости от того, что наступит раньше. Однако еслиpermute
вместо этого, результаты могут стать запутанными.
ДВК опубликовал пример того, как это сделать, в другом ответе. Сначала я бы одобрил его ответ, если вы найдете его полезным.
#!/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);
}