Wie Getopt :: Long-Methode verwenden?
-
01-10-2019 - |
Frage
Wie kann ich Getopt :: Long Methode, wenn die Eingabe der Befehlsausführung ist wie folgt:
$ testcmd -option check ARG1 ARG2 ARG3
oder
$ testcmd ARG1 ARG2 ARG3
Lösung
Ein kurzes Beispiel:
#! /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
ist sehr flexibel, was es akzeptieren wird:
$ ./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
Andere Tipps
Sie müssen die pass_through
Option aktivieren. Dokumentation zitiert unter:
pass_through
(Standard: deaktiviert)Optionen, die unbekannt sind, zweideutig oder mit einem ungültigen Optionswert geliefert werden durch stattdessen in @ARGV geleitet von wobei als Fehler gekennzeichnet. Dies macht es möglich Wrapper-Skripte zu schreiben, Prozess nur einen Teil der Benutzer gelieferten Befehlszeilenargumente, und übergeben die verbleibenden Optionen zu einem anderen Programm.
Wenn
require_order
aktiviert ist, Optionen Verarbeitung an den ersten enden nicht erkannte Option oder nicht-Option, welches auch immer zuerst kommt. Wie auch immer, wennpermute
wird stattdessen Ergebnisse aktiviert werden kann verwirrend.
DVK des entsandten ein Beispiel , wie diese in einer anderen Antwort zu tun. Ich würde upvote seine Antwort zuerst, wenn Sie es nützlich finden.
#!/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);
}