Re: perl + Konfigurationsdatei
Hallo,
Am Mon, 29 Mär 2010, Kai Wilke schrieb:
[..]
>sub read_conf_file {
> my %data = ();
>
> unless (open(CONFFILE,$conf_file)) {
> #`logger -t dns_update.pl error opening configuration file`;
> print STDERR "Can't open configuration file\n";
> exit 1;
> }
> while (<CONFFILE>) {
> chomp;
> s/#.*//;
> s/^\$+//;
> s/\s+$//;
> next unless length;
> my ($var, $value) = split(/\$*=\$*/, $_, 2);
Was soll das denn? Also die '\$'?
while (<CONFFILE>) {
chomp;
s/#.*//;
next if /^\s*$/; ## auch Zeilen mit nur vergessenem Whitespace
## und somit 'length($_) > 0' interessieren nicht ...
s/^\s+//;
s/\s+$//;
my ($var, $value) = split(/\s*=\s*/, $_, 2);
Hier könnte man evtl. man nen Benchmark gegen ne Regex machen:
next if /^\s*$/;
if( /^\s*([^=]+)\s*=\s*(.*)\s*$/ ) { $conf{$1} = $2; }
> $data{$var} = $value;
> }
> close CONFFILE;
>
> return %data;
>}
>
>my %meine_daten = &read_conf_file;
BTW: Funktionen sollte man eher nicht per & aufrufen.
my %conf = read_conf_file();
>#
># zur Kontrolle den Hash ausgeben
>#foreach my $key (keys %meine_daten) {
># print $key, ' ', $meine_daten{$key}, "\n";
>#}
ok
>foreach my $key (keys %meine_daten) {
> if ($key eq "domain_name" ) {
> $domain_name = $meine_daten{domain_name};
> }
> if ($key eq "lease_file" ) {
> $lease_file = $meine_daten{lease_file};
> }
[..]
>}
>#$domain_name = $meine_daten{domain_name};
>#$lease_file = $meine_daten{lease_file};
[..]
>#$debug = $meine_daten{debug};
>
># Domain name
>#my $domain_name = "netzworkk.de";
>#
>## DHCPD lease file
>#my $lease_file = "/var/lib/dhcp3/dhcpd.leases";
[..]
>#my $debug = 0;
Weia ;)
my $domain_name = $conf{'domain_name'} || "netzworkk.de";
my $lease_file = $conf{'lease_file'} || "/var/lib/dhcp3/dhcpd.leases";
usw.
Oder, "elegant":
my %defaults = (
domain_name => "netzworkk.de",
lease_file => "/var/lib/dhcp3/dhcpd.leases",
...
);
map { $conf{$_} ||= $defaults{$_}; } keys %defaults;
und anschließend %conf verwenden. Die "map" Zeile füllt evtl. nicht
in der .conf gesetzte Variablen aus %defaults auf.
Wenn's unbedingt globale Variablen sein müssen ginge das z.B. mit
eval (was aber gefährlich / böse ist).
my ($domain_name, $lease_file, ... );
map { eval "\$$_ = \$conf{$_} || \$defaults{$_}"; } keys %defaults;
Generell wäre es wohl besser, eins der Config:: Module zu verwenden,
die kümmern sich um all so lästiges Zeugs und man kann dann auch noch
mit Getopt hinterher ;)
Generell2: für Anschauungszwecke ist es sinnvoll externe Dateien mit
einzubauen, d.h. nach __DATA__ (und Verwendung des Dateihandles DATA),
hier also die Configdatei ;)
HTH,
-dnh
--
Ceci n'est pas une .signature.
Reply to: