Hi Leute,
ich wollte euch mal meine Mini-Bibliothek vorstellen, die ich zum Verwalten von Konfigurationsdateien (*.ini) verwende. Ich war mit den Möglichkeiten der Module, die ich gefunden hab nie zufrieden, deswegen hab ich mir was eigenes gebastelt, was meinem Geschmack entspricht.
Die Konfigurationsdatei sollte wie folgt aufgebaut sein:
[topic]
key=value
key=value
...
[topic]
key=value
key=value
...
Ich finde dieses Format sehr praktisch, deswegen benutze ich kaum noch was anderes. Man sucht nach einem Topic und ließt dann die key-value-Paare aus. Dadurch kann man den gleichen key auch mehrmals in verschiedenen Topics verwenden. Ich bin leider ziemlich schlecht im Dokumentieren, aber ich hoffe mal der Code erklärt sich selbst... :)
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
103
104
#/usr/bin/perl
use strict;
use warnings;
return 1;
sub read_ini
{
# reads an ini-file
# returns a hash containing the key-value pairs
my @content;
my %lines;
my $file=shift; # filename
my $name=shift; # name of target topic
open(IN,"<$file") or die "$!";
@content=<IN>;
close(IN);
my $i=0;
my $n=0;
for (@content)
{
$i++ if /\[.*?\]/io;
$n=$i if /\[$name\]/io;
$lines{"$1"}="$2" if /^(.*?)\=(.*)$/i and $i==$n;
last if $i>$n;
}
return %lines;
}
sub change_ini
{
# changes key-value pairs
# returns true when done
my @content;
my %lines;
my $file=shift; # filename
my $name=shift; # name of target topic
my $key=shift; # target key
my $value=shift; # new value
open(IN,"<$file") or die "$!";
@content=<IN>;
close(IN);
my $i=0;
my $n=0;
for (@content)
{
$i++ if /\[.*?\]/io;
$n=$i if /\[$name\]/io;
s/(^$key\=)(.*)$/$1$value/i, last if /(^$key\=)(.*)$/i and $i==$n;
}
open(IN,">$file") or die "$!";
for(@content)
{
print IN $_;
}
close(IN);
return 1;
}
sub ins_item_ini
{
# inserts a new key-value pair
# returns true when done
my @content;
my $file=shift; # filename
my $name=shift; # name of topic
my $new_kv=shift; # something like admin=123456
open(IN,"<$file") or die "$!";
@content=<IN>;
close(IN);
my $i=0;
my $n=0;
open(IN,">$file") or die "$!";
for(@content)
{
$i++ if /\[.*?\]/io;
$n=$i if /\[$name\]/io and $n ne '-';
if($n eq $i and $n ne '-')
{
print IN "$new_kv\n";
print IN $_;
$n='-';
}
else
{
print IN $_;
}
}
close(IN);
return 1;
}
Vorschläge für Optimierungen und Weiterentwicklungen sind erwünscht! Die Kritik am Programmierstil könnt ihr euch sparen, ich weiß, dass das Ding noch lange nicht optimal ist.