2010-08-08 4 views
9

Ich verwende Perls Getopt::Long Modul, um Befehlszeilenargumente zu analysieren. Es scheint jedoch, dass es einen wahren Wert zurückgibt, selbst wenn einige der Argumente fehlen. Gibt es eine Möglichkeit zu sagen, ob dies der Fall ist?Wie bekomme ich Perls Getopt :: Long, um zu sagen, ob Argumente fehlen?

+0

Große Frage. Ich wünschte, es gäbe einen Weg, dies zu tun, als die Werte für undef zu überprüfen. – tster

+0

Es ist verständlich, warum dies für so viele Menschen verwirrend ist, da die Dokumente für Getopt bedeuten, dass Sie die erforderlichen Optionen angeben können. "Bei Optionen, die Werte annehmen, muss angegeben werden, ob der Optionswert erforderlich ist oder nicht und welche Art von Wert die Option erwartet." http://perldoc.perl.org/Getopt/Long.html – lfalin

Antwort

5

Im einfachen alten Getopt :: Long, können Sie dies nicht direkt tun - wie Jonathan sagte, müssen Sie Ihre Anforderungen für undef überprüfen. Aber das ist eine gute Sache - was ist ein "erforderlicher" Parameter? Oft hat man Parameter, die in einem Fall und nicht in einem anderen Fall erforderlich sind - das häufigste Beispiel hierfür ist der wunde Daumen der Option --help. Es ist nicht erforderlich, und wenn der Benutzer es verwendet, weiß er wahrscheinlich keine der anderen "erforderlichen" Parameter oder wird sie nicht bestehen.

Ich benutze dieses Idiom in einigen meiner Code (na ja, ich pflegte, bis ich mit MooseX::Getopt geschaltet):

use List:MoreUtils 'all'; 

Getopt::Long::GetOptions(\%options, @opt_spec); 
print usage(), exit if $options{help}; 
die usage() unless all { defined $options{$_} } @required_options; 

Auch bei MooseX :: Getopt Ich habe nicht die Attribute required => 1 , wieder wegen der --help Option. Stattdessen überprüfe ich das Vorhandensein aller Attribute, die ich brauche, bevor ich in den Hauptteil der Programmausführung übergehe.

package MyApp::Prog; 
use Moose; 
with 'MooseX::Getopt'; 

has foo => (
    is => 'ro', isa => 'Str', 
    documentation => 'Provides the foo for the frobnitz', 
); 
has bar => (
    is => 'ro', isa => 'Int', 
    documentation => 'Quantity of bar furbles to use when creating the frobnitz', 
); 

# run just after startup; use to verify system, initialize DB etc. 
sub setup 
{ 
    my $this = shift; 

    die "Required option foo!\n" unless $this->foo; 
    die "Required option bar!\n" unless $this->bar; 

    # ... 
} 
4

Optionen sind optional, daher der Name 'Getopt'.

Sie überprüfen die Optionswerte, die von Getopt::Long gesetzt werden; wenn einer der entscheidenden ist 'undef', wurde es verpasst und Sie können es identifizieren.

Der Rückgabewert sagt Ihnen, dass es in der Befehlszeile keine schrecklichen Fehler gab. Was einen Fehler ausmacht, hängt davon ab, wie Sie Getopt::Long verwenden, aber ein klassisches wäre, dass die Befehlszeile -o output enthält, aber der Befehl eine -o Option nicht erkennt.

+3

Manchmal sind Optionen nicht optional. – tster

+0

@tster: Ich stimme zu; manchmal erfordert ein Befehl eine bestimmte Option, um angezeigt zu werden - und es wäre schön, das Getopt-Paket darüber informieren zu können, dass dies der Fall ist. Vielleicht unterstützen einige der anderen Getopt-Pakete das? Es gibt eine große Auswahl (und ich habe selbst gewürfelt - aber es unterstützt keine obligatorischen Argumente). Es gibt ein Argument, dass obligatorische Optionen keinen Minus-Buchstaben voraus brauchen sollten; sie werden zu Positionsargumenten. Wenn es jedoch mehrere solcher Argumente gibt, wird es schnell schwierig, sich Positionen zu merken. –

Verwandte Themen