Thread Datei lesen und in Hash schreiben? (45 answers)
Opened by Math55 at 2004-01-18 22:12

Dubu
 2004-01-20 16:35
#79283 #79283
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[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.

Quote
Wä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:
Code: (dl )
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?
Code: (dl )
1
2
KEY = foo bar \
      baz # ergibt die Werte foo, bar und baz fuer KEY

View full thread Datei lesen und in Hash schreiben?