professionelle Skripte mit Getopt::Long

Veröffentlicht: Juli 17, 2016 in Perl
Schlagwörter:

perl-logoGetopt::Long ist ein Modul zum Parsen von Kommandozeilenargumenten, so kann man auf einfache Weise ein Unix-ähnliches Inferface erzeugen. Mit nur wenigen Zeilen Code lassen sich Parameter übergeben, sowie deren Typ prüfen.

ein einfaches Programm

Da Getopt::Long Bestandteil der CoreDistribution von Perl ist, lässt es sich ohne weitere Installation direkt nutzen.

#!/usr/bin/perl
use Getopt::Long;

GetOptions(
  'debug' => \my $debug,
) or die "fehlerhaftes Argument: $0\n";

print "starte im Debugmodus\n" if $debug;

Eingebunden wird das Modul wie unter Perl üblich mit dem use-Pragma (Zeile 2), die eigentlich Verarbeitung erfolgt mittels GetOptions (Zeile 4-6).

$ ./getopt.pl --debug
starte im Debugmodus

$ ./getopt.pl -d
starte im Debugmodus

$ ./getopt.pl -w
Unknown option: w
fehlerhaftes Argument: ./getopt.pl

In diesem Beispiel enthält das Argument debug keinen Parameter. Startet man das Skript nun mittels – -debug auf wird die Variable $debug auf 1 gesetzt, ansonsten undef. Standardmässig erkennt Getopt::Long auch die Kurzform des Arguments (-d). Verwendet man ein unbekanntes Argument erhält man durch GetOptions eine entsprechende Fehlermeldung: „Unknown option: ..“.

inkrementelle Nutzung

Argumente lassen sich auch inkrementell nutzen (Zeile 5), so fungiert die Variable $debug als Counter.

#!/usr/bin/perl
use Getopt::Long;

GetOptions(
  'debug+' => \my $debug,
) or die "fehlerhaftes Argument: $0\n";

print "starte im Debugmodus $debug\n" if $debug;
$ ./getopt.pl -d -d
starte im Debugmodus 2
Type Checking

Mit Hilfe von Getopt::Long ist sehr einfach möglich den Typ des übergebenen Paramaters zu prüfen:

  • keine weitere Angabe => Flag
  • s => String
  • i => Integer
  • f => Float

In dem hier gezeigten Beispiel ist die Angabe eines Parameters hinter dem Argument Pflicht (=). Soll Angabe des Parameters optional sein verwendet an statt = ein :

#!/usr/bin/perl
use Getopt::Long;

GetOptions(
  'debug'     => \my $flag,    #Flag
  'string=s'  => \my $string,  #String
  'integer=i' => \my $integer, #Integer
  'float=f'   => \my $float,   #Float

) or die "fehlerhaftes Argument: $0\n";

print "Debug-Flag ist gesetzt\n" if $flag;
print "String enthält: $string\n" if $string;
print "Integer enthält: $integer\n" if $integer;
print "Float enthält: $float\n" if $float;
$ ./getopt.pl --integer test
Value "test" invalid for option integer (number expected)
Default-Werte
#!/usr/bin/perl
use Getopt::Long;

GetOptions(
  'debug' => \$debug,
  'optional:s' => \(my $optional = 'default')
  #String ist optional und hat einen Defaultwert
) or die "fehlerhaftes Argument: $0\n";

print "Optionaler String enthält: $optional\n";
$ ./getopt.pl --optional test
Optionaler String enthält: test

$ ./getopt.pl -d
Optionaler String enthält: default
mehr Nützliches

Zum Schluss noch einige weitere nützliche Verwendungen:

  • Argumente mit unterschiedlichen Namen: Zeile 5, mittels |
  • Übergabe mehrerer Parameter in ein Array, hier mit festgelegter Größe: Zeile 6
  • in Zeile 7 erfolgt der direkter Aufruf einer Subroutine
#!/usr/bin/perl
use Getopt::Long;

GetOptions(
  'debug|verbose' => \my $debug,
  'rgbcolor=i{3}' => \my @rgbcolor,
  'subroutine' => sub {print "start einer Subroutine\n"}, #alternativ: \&subroutine
) or die "fehlerhaftes Argument: $0\n";

print "RGB-Farbcode: $_\n" for @rgbcolor;

Dieser Artikel zeigt nur einige häufig verwendete Möglichkeiten von Getopt::Long, weitere Optionen lassen sich der Getopt::Long entnehmen. Möchte man Argumente in der Form -vax übergeben, sollte man einen Blick auf den Punkt Bundling werfen.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

w

Verbinde mit %s