[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: