Thread Probleme mit GetOpt::Long (19 answers)
Opened by YAPD at 2019-06-23 15:58

Linuxer
 2019-06-24 20:03
#190148 #190148
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Schau mal nach, was in der Variable zur Option "-Verify" drin steht.

Verify erfordert zwingend ein Argument (einen String; beachte das "Verify=s" im GetOptions()-Aufruf). Das dürfte in diesem Fall eben "-Module" sein.
Damit ist die Option Verify zufrieden gestellt und dann wird kein "-Module" mehr als Option gefunden...

PS: Siehe dazu auch https://metacpan.org/pod/Getopt::Long#Options-with...

perldoc Getopt::Long
If the option value is required, Getopt::Long will take the command line argument that follows the option and assign this to the option variable. If, however, the option value is specified as optional, this will only be done if that value does not look like a valid command line option itself.

(Hervorhebung von mir)

Letzten Endes musst Du Dich entscheiden, welche Optionen optionale oder erzwungene Argumente haben sollen.
Falls Strings mit "-" oder "--" beginnend nie ein gültiges Argument sein können, könntest Du vor der Kontrolle ob -Verify mit -Module angegeben wurde, prüfen, ob das Argument ungültig ist und abbrechen und eine entsprechende Ausgabe liefern.

PPS:
Je nach Anwendungsfall könnte man auch eine Subroutine verwenden, die direkt die Option und das Argument überprüft. Schema (ungetestet):

Code (perl): (dl )
1
2
3
GetOptions(
  "Verify=s" => sub { die "ungültiges Argument für Option $_[0]\n" if $_[1] =~ m/^-/; $Verify = $_[1]; },
) or exit 255;


Anstatt jeweils eine anonyme Routine zu schreiben, könnte man auch eine Check_Routine schreiben, und diese aufrufen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub Check_Single_Option {
  ( $opt_name, $opt_value, $regex ) = @_;

  if ( $opt_value !~ $regex ) {
    die "Ungueltiges Argument fuer $opt_name\n";
  }
  else {
    return $opt_value;
  }
}

GetOptions(
  "Verify=s" => sub { Check_Single_Option( @_, qr/^[^-/ ) },
) or exit 255;


Die anonyme Sub braucht es hier auch, damit der Regex zur Prüfung mit übergeben werden kann.
Last edited: 2019-06-24 20:35:04 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Probleme mit GetOpt::Long