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?
Antwort
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;
# ...
}
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.
Manchmal sind Optionen nicht optional. – tster
@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. –
- 1. Wie verwende ich Getopt :: Long, um Argumente zu parsen, die Leerzeichen enthalten können?
- 2. Wie bekomme ich current_page_url um aktiv in jquery zu sagen
- 3. Wie analysiere ich eine Zeichenfolge mit GetOpt :: Long :: GetOptions?
- 4. In neueren Getopt :: Long Wie kann ich optional Standardwerte
- 5. Wie erkenne ich Kombinationsargumentfehler mit Getopt :: Euclid?
- 6. Ist Perl's GetOpt :: Long akzeptieren Abkürzungen von Switches ein Fehler?
- 7. Sollten Sie den Rückgabecode von Getopt :: Long :: GetOptions überprüfen?
- 8. Wie bekomme ich Argumente von SP.UI.ModalDialog?
- 9. „GetOptionsFromString“ exportiert wird nicht durch das Getopt :: Long-Modul
- 10. Perl Getopt :: Long Verwandte Frage - gegenseitig ausschließende Befehlszeilenargumente
- 11. wie schreibe ich es, um zu sagen, ob eine Zahl gleich ist oder nicht
- 12. Wie bekomme ich Argumente in einer Formularanwendung?
- 13. 2 Argumente fehlen, aber Methode funktioniert
- 14. Wie bekomme ich __init __(), um eine nützlichere Ausnahme anstelle von TypeError zu erzeugen, wenn die Argumente falsch sind?
- 15. Wie bekomme ich die Bits eines "double" als "long"
- 16. VisualVM/OQL Wie bekomme ich das Ergebnis von Long ID?
- 17. Wie bekomme ich Lat Long einer Adresse mit arcGis JavaScript
- 18. ASP.NET wie zu sagen, ob Div nach unten scrollt
- 19. Wie kann ich sagen, ob es zsh oder bash verwendet?
- 20. Wie bekomme ich MacVim um python_fn.vim zu erkennen?
- 21. Wie bekomme ich Cloud9, um eine "globale" Variable zu akzeptieren?
- 22. Muss ich eine Instanz von Long erstellen, um ein Long als Parameter zu senden?
- 23. Long To XMLGregorianCalendar und zurück zu Long
- 24. R überprüfen, ob fehlende Argumente
- 25. Weird getopt = s Handhabung?
- 26. Wie bekomme ich Doxygen, um die Vererbungsbeziehung zu ignorieren?
- 27. Wie bekomme ich LINQ um nach Kultur zu bestellen?
- 28. Wie bekomme ich HttpClient Json Serializer um Nullwerte zu ignorieren?
- 29. Wie installiere ich Perls SVN :: Client?
- 30. Wie bekomme ich Logout um auf RubyCAS-Server zu arbeiten?
Große Frage. Ich wünschte, es gäbe einen Weg, dies zu tun, als die Werte für undef zu überprüfen. – tster
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