[quote=Patrick,20.01.2004, 14:49]Am günstigsten wäre es wohl, wenn Die Datei so wieder rauskommt, wie man sie gelesen hat.
Abgesehen von den veränderten Werten.
[/quote]
Ah, okay. Du willst eine Datei einlesen, ein paar Werte austauschen und dann wieder schreiben. Und die Kommentare sollen wohl jeweils den Werten und nicht den Schluesseln zugeordnet sein. Hm. Das wird etwas schwieriger.
QuoteWäre eine Idee die Kommentare, die schon ausgegeben wurden zu löschen, damit diese nicht nochmal drankommen bei z.B. Listen.
Das habe ich jetzt nicht verstanden.
Was fuer "Kommentare, die schon ausgegeben wurden"?
Hier ist erstmal eine Version, die die Kommentare zu jedem Schluessel gesammelt speichert:
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
#!/usr/bin/perl
use strict;
use warnings;
my %params;
open PARAM, "param.dat" or die $!;
my $buffer = '';
my $commentbuffer = '';
while (<PARAM>) {
# Kommentare extrahieren
if (s/\s*#\s*(.*?)\s*(\\?\n)/$2/) {
my $ctemp = $1;
if (length $ctemp) {
if (length $commentbuffer) {
$commentbuffer .= "\n" . $ctemp;
} else {
$commentbuffer = $ctemp;
}
}
}
# Leerzeichen an Anfang und Ende loeschen
s/^\s+//;
s/\s+$//;
# Zeile jetzt leer?
unless (length) {
# vorhandenen Buffer bearbeiten
insert_keys (\$buffer, \$commentbuffer, \%params);
next;
}
# Zeile merken
$buffer .= $_;
if ($buffer =~ /\\$/) { # Fortsetzung folgt?
# Fortsetzungszeichen durch Leerzeichen ersetzen
chop $buffer; $buffer .= " ";
next;
}
insert_keys (\$buffer, \$commentbuffer, \%params);
}
# Falls die letzte Zeile noch ein Fortsetzungszeichen hatte ...
insert_keys (\$buffer, \$commentbuffer, \%params);
use Data::Dumper;
print Dumper \%params;
#############################################
sub insert_keys {
my ($bufferp, $cbufferp, $paramp) = @_;
return unless defined $$bufferp && length $$bufferp;
die "Syntaxfehler in Zeile $." unless index ($$bufferp, '=') >= 0;
my ($key, $val) = split /\s*=\s*/, $$bufferp, 2;
unless (defined $val) {
$paramp->{$key} = undef;
return;
}
if ($val =~ /\s/) { # Leerzeichen zwischen Woertern? => Liste
my @vals = split " ", $val;
$paramp->{$key}{wert} = \@vals;
} else {
$paramp->{$key}{wert} = $val;
}
$paramp->{$key}{comment} = $$cbufferp;
$$cbufferp = "";
$$bufferp = "";
}
#############################################
Wie ist das denn:
Aenderst du nur einzelne Werte oder werden auch welche hinzugefuegt oder geloescht? Kommen auch Schluessel hinzu/weg? Steht eigentlich immer ein Wert in einer eigenen Zeile, oder koennen auch mehrere hintereinander stehen, z.B. so?
KEY = foo bar \
baz # ergibt die Werte foo, bar und baz fuer KEY