Thread Kommandozeilenparameter übergeben (43 answers)
Opened by franc at 2011-01-17 16:34

Dubu
 2011-01-17 19:59
#144782 #144782
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Das mit dem '$' vs. '@' hat sich ja jetzt aufgeklärt, deshalb hier ein paar Varianten.

Deine erste Form
Code (perl): (dl )
1
2
3
4
my $map_type = $ARGV[0];
my $map_zoom = $ARGV[1];
my $top_left = $ARGV[2];
my $bottom_right = $ARGV[3];
ist möglich, aber fehlerträchtig, weil man den Index hochzählen muss. Das ginge zwar mit einer Zählvariablen, dann wird's aber richtig unübersichtlich.

Die Variante mit shift hat den Vorteil, dass man nicht zählen muss:
Code (perl): (dl )
1
2
3
4
my $map_type = shift @ARGV;
my $map_zoom = shift @ARGV;
my $top_left = shift @ARGV;
my $bottom_right = shift @ARGV;
Außerdem ist @ARGV danach auch leer, was ganz praktisch sein kann. Entweder, wenn man unbedingt <> statt <STDIN> benutzen will ;-) oder wenn man prüfen will, ob @ARGV leer ist, um Fehler bei der Eingabe zu erkennen.

Man kann das Ganze auch etwas verkürzen. Ob es übersichtlicher ist, das ist Ansichtssache. Hängt vielleicht auch von der Formatierung ab:
Code (perl): (dl )
my ($map_type, $map_zoom, $top_left, $bottom_right) = @ARGV;
Alles, was von @ARGV nicht mehr in die Variablen passt, wird hier einfach weggeworfen.

Die ganz vornehme Art, Kommandozeilenparameter auszuwerten, ist natürlich die mit benannten Parametern. Die Kommandozeile sähe dann beispielsweise so aus:
Code: (dl )
perl myprog --type bla --zoom 2 --top-left 0,0 --bottom-right 1280,1024
Das hat natürlich den Nachteil, dass die Zeile länger wird. Dafür ist sie verständlicher und verlangt keine feste Reihenfolge der Parameter, wenn man sie mit dem passenden Modul auswertet. Das ist auch ganz einfach:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
use Getopt::Long;

# Variablen deklarieren
my ($map_type, $map_zoom, $top_left, $bottom_right);

GetOptions(
    'type=s' => \$map_type,
    'zoom=i' => \$map_zoom,
    'top-left:s' => \$top_left,
    'bottom-right:s' => \$bottom_right,
) or die "Usage: ...";

Hier werden automatisch den Variablen die entsprechenden Werte zugewiesen. Man kann auch ein wenig den erwarteten Parametertyp oder optionale Parameter festlegen. In diesem Fall ist --type ein erforderlicher Parameter und vom Typ String (type=s), --zoom auch erforderlich und vom Typ Integer (zoom=i), während --top-left und --bottom-right optional und vom Typ String sind (:s). Im Fehlerfall wird eine Meldung ausgegeben und GetOptions() gibt false zurück.

Statt die Werte skalaren Variablen zuzuweisen, kann man auch Arrays, Hashes und Referenzen nehmen oder eine Subroutine mit dem jeweiligen Wert aufrufen. CPAN:Getopt::Long bietet da noch einiges.

View full thread Kommandozeilenparameter übergeben