Thread wieder reex
(4 answers)
Opened by wenze at 2009-06-02 23:14
Besser noch beim "split" noch angeben dass es nur zwei Teile sein sollen und es währe sinnvoll Leerzeichen zu beachten, denn man kann ja in der Kommandozeile auch folgendes schreiben:
Code: (dl
)
perl args.pl "sid = sss" "instno = 22" "solmankey = 22222222" also: Code (perl): (dl
)
my ($key, $value) = split /\s*=\s*/, $_, 2; Ich würde das Objektorientiert machen. Das hat den Vorteil, dass man das später einfacher erweitern kann. Wenn z.B. die Konfiguration aus einer Datei gelesen werden soll, dann braucht man nur die Klasse an zu passen, ohne den rechtlichen Code verändern zu müssen. Als ungetestetes Beispiel Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 #!/usr/bin/perl use strict; use warnings; { package cmdline; # create new object sub new { my $class=shift; # restliche Parameter lesen # Bei Arrayreffenz diese lesen, # ansonsten Array annehmen my $argv=[]; if(ref($_[0]) eq 'ARRAY') { $argv = shift; } else { $argv=[@_]; } bless($self,$class); $self->_parse($argv); return $self; } # private parse sub _parse { my $self=shift; my $argv=shift; # sinnvolle Werte vordefinieren: # das ist nützlich, # wenn man allgemeine Steueroptionen wie "verbose" hat $self->{verbose}=0; # parsen for(@{$argv}) { my ($key, $value)=split(/\s*=\s*/,$_,2); # eventuell währen hier noch ein paar Test sinnvoll, # ob die Werte gültig sind. # z.B. # wenn Nicht-Wortzeichen enthalten sind überspringen next if($key=~/\W/); # wenn sid keine Zahl ist überspringen next if($key eq 'sid' and $value !~/^\d+$/); $self->{$key}=$value; } return 1; } # get value for key sub get { my $class=shift; my $key=shift; return undef unless has($key); return $self->{$key}; } # get all keys sub keys { return keys(%{$_[0]}) } # test for key sub has { return exists($_[0]->{$_[1]}); } # set a key sub set { $_[0]->{$_[1]}=$_[2]; return 1; } # Beispiel für eine Abkürzung: # so braucht man nicht # $cmds->get('verbose') > 0 # schreiben sub verbose { return $_[0]->{verbose} > 0; } 1; } package main; my $cmds = cmdline->new(@ARGV); # erst fragen ob die Option existiert, # wenn nicht -> Fehler. my $sid = -1; if( !$cmds->has('sid') ) { # wenn "verbose" > 0 mit einer richtigen Fehlermeldung sterben, # ansonsten mit einem Fehler ( exit-Wert > 0 ) sterben if($cmds->verbose) { die 'Bitte "sid" setzen!'; } else { exit 1; } } $cmds->get('sid'); |