Thread wieder reex (4 answers)
Opened by wenze at 2009-06-02 23:14

topeg
 2009-06-03 02:18
#122254 #122254
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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');

View full thread wieder reex