Wie kann ich nicht definierte Optionen erlauben, wenn args mit Getopt Parsen
-
25-09-2019 - |
Frage
Wenn ich eine Befehlszeile wie:
my_script.pl -foo -WHATEVER
Mein Skript kennt --foo
, und ich möchte Getopt Variable $opt_foo
setzen, aber ich weiß nichts über -WHATEVER
. Wie kann ich Getopt sage die Optionen zu analysieren, dass ich ihm erzählt habe, und dann den Rest der Argumente in einem String-Variable oder eine Liste bekommen?
Ein Beispiel:
use strict;
use warnings;
use Getopt::Long;
my $foo;
GetOptions('foo' => \$foo);
print 'remaining options: ', @ARGV;
Dann Ausgabe
perl getopttest.pl -foo -WHATEVER
gibt
Unknown option: whatever remaining options:
Lösung
Sie müssen konfigurieren "pass_through" Option über Getopt::Long::Configure("pass_through");
Dann unterstützt es tatsächlich Optionen (z Sachen beginnend mit „-“ und ohne die speziellen „-“ Trennzeichen das Ende der „echter“ Optionen zu bedeuten).
Hier Perldoc Zitat :
-
pass_through (Standard: deaktiviert)
Optionen, die nicht bekannt sind, nicht eindeutig oder mit einem ungültigen Optionswert geliefert werden, in
@ARGV
durchläuft statt als Fehler markiert. Dies ermöglicht es, Wrapper-Skripten zu schreiben, dass Verfahren nur einen Teil der Befehlszeilenargumente geliefert Benutzer, und die verbleibenden Optionen zu einem anderen Programm zu übergeben.
Hier ist ein Beispiel:
$ 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'
];
Andere Tipps
Sind nicht die übrigen (unparsed) Werte einfach hinter in @ARGV
links? Wenn Ihr zusätzliche Inhalte beginnt mit Bindestrichen, müssen Sie das Ende der Optionsliste mit einem --
, um anzuzeigen:
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper;
my $foo;
my $result = GetOptions ("foo" => \$foo);
print Dumper([ $foo, \@ARGV ]);
Dann Aufruf:
my_script.pl --foo -- --WHATEVER
gibt:
$VAR1 = [
1,
[
'--WHATEVER'
]
];
PS. In MooseX :: Getopt , die "restlichen" Optionen in der Befehlszeile sind put in das extra_argv
Attribut als ArrayRef - so ich Umwandlung würde empfehlen
Ich denke, die Antwort hier, leider aber ist: „Nein, es ist kein Weg, um es genau zu tun, wie Sie fragen, mit Getopt :: Long, ohne @ARGV Parsen auf eigene Faust.“ Ether hat eine gute Abhilfe, though. Es ist ein Merkmal so weit wie die meisten Menschen betroffen sind, dass jede Option artiges Argument als Fehler erfasst wird. Normalerweise können Sie tun
GetOptions('foo' => \$foo)
or die "Whups, got options we don't recognize!";
zu Capture / verhindern ungerade Optionen übergeben werden, und dann können Sie den Benutzer auf Nutzung korrigieren. Alternativ können Sie einfach durchlaufen und sie ignorieren.