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:
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top