Monday, July 02, 2007

Weg mit globalen Variablen, her mit Konfigurationsdateien.

In vielen Skripten (auch in meinen älteren Skripten) sieht man am Anfang gaaaaanz viele globale Variablen. Ich finde globale Variablen nicht so schön - aus mehreren Gründen:

  • Die Konfiguration passiert innerhalb des Skripts
  • Das Skript wird unübersichtlich
  • Sie verleiten zu sehr zu einer globalen Verwendung (keine Parameterübergabe)
  • Man "verbraucht" sinnvolle Variablennamen

Ich verwende mehr und mehr Konfigurationsdateien. Perl liefert viele Module zum Auslesen von Konfigurationsdateien - ich verwende am liebsten YAML- und INI-Dateien. INI-Dateien haben den Vorteil, dass sie auch viele "Nicht-Programmierer" verstehen, was ein großer Vorteil ist wenn die Applikation weitergegeben wird. YAML hat dagegen den Vorteil, dass damit komplexe Datenstrukturen dargestellt werden können. Viele werden wohl sagen "da kann man auch XML nehmen". Ich finde XML zu aufgeblasen, viel Informationsoverhead...

Hier mal Beispiele für die Verwendung von YAML- bzw. INI-Dateien für die Konfiguration:

test.yml

---
user: beispieluser
max_files: 19



Skript

#!/usr/bin/perl

use strict;
use warnings;
use YAML::Tiny;

my $file = 'test.yml';

my %config = %{ YAML::Tiny->read( $file )->[0] };

print qq~
Database user: $config{user}
Maximum files: $config{max_files}
~;


test.ini

[config]
user=beispieluser
max_files=19


Skript

#!/usr/bin/perl

use strict;
use warnings;
use Config::IniFiles;

my $file = 'test.ini';

tie my %hash, 'Config::IniFiles', (-file => $file );
my %config = %{ $hash{config} };

print qq~
Database user: $config{user}
Maximum files: $config{max_files}
~;

2 comments:

Anonymous said...

Ich nehme meistens Config::Auto.
Sind dann nur zwei Zeilen...
use Config::Auto;
my $config = Config::Auto::parse();

Wenn ich ein Programm mehrfach starten muss, dann arbeite ich mit Links für das Perl Script und verschiedenen Config-Files . Macht alles sehr übersichtlich

ReneeB said...

Kein schlechter Hinweis. Solche Module, die verschiedene Formate zulassen, sind sicherlich ganz gut.

Ich nutze trotzdem am liebsten YAML::Tiny, da das sehr kompakt ist, was die Installation von Perl-Applikationen auf Shared-Webhosting-Plätzen vereinfacht...

Bei Config::Auto ich das mit den "voreingestellten" Parsern etwas zu starr. Config::Any
bietet die Möglichkeit, eigene Plugins zu schreiben... Und es hat ein paar Fallbacks...

Was mir an Config::Auto ganz gut gefällt ist, dass es selbständig herausfindet, welche Art von Konfigurationsdatei es ist...