#!/usr/bin/perl use strict; use warnings; my %params; open PARAM, "param.dat" or die $!; my $currentkeyword = ''; my $currentvalue = ''; my @freecomments = (); my $continued = 0; while () {    chomp;    # Leerzeichen vorne/hinten loeschen    s/^\s+//;    s/\s+$//;    # Diese Zeile fortsetzen?    if (/\\$/) {        chop;        # evtl. nochmal Leerzeichen am Ende loeschen        s/\s+$//;        $continued = 1;    } else {        $continued = 0;    }    if (/^#\s*(.*)/) {  # nur Kommentar        if (length $currentkeyword && length $currentvalue) {   # Kommentar zu einem Wert            push @{$params{$currentkeyword}{comments}{$currentvalue}}, $1;        } else {                # freier Kommentar            push @freecomments, $1;        }    } elsif (length) {          # keine Leerzeile        my ($ktemp, $ctemp);    # Hilfsvariablen        if (/^(.+?)\s*#\s*(.*)/) {      # Zeile mit Kommentar?            ($ktemp, $ctemp) = ($1, $2);        } else {            ($ktemp, $ctemp) = ($_, '');        }        if (length $currentkeyword) {   # Wenn es ein aktuelles Keyword gibt ...            $currentvalue = $ktemp;     # ... Wert merken ...        } elsif (index ($ktemp, '=') >=0) { # ansonsten muss es "Schluessel = Wert" sein            ($currentkeyword, $currentvalue) = split /\s*=\s*/, $ktemp, 2;            push @{$params{keywords}}, $currentkeyword;        } else {                        # keine korrekte Syntax            die "Syntaxfehler in Zeile $.";        }        # Jetzt neuen Wert im Array @{$params{$currentkeyword}{values}} merken ...        push @{$params{$currentkeyword}{values}}, $currentvalue;        # ... und evtl. Kommentar dazu im Array @{$params{$currentkeyword}{comments}{$currentvalue}} ablegen.        push @{$params{$currentkeyword}{comments}{$currentvalue}}, $ctemp if length $ctemp;    }    # Wenn die naechste Zeile Fortsetzung ist, bei neuer Zeile weiter ...    next if $continued;    # ... ansonsten freie Kommentare beim Keyword speichern und Keyword loeschen    if (length $currentkeyword && @freecomments) {        @{$params{$currentkeyword}{precomments}} = ( @freecomments );        @freecomments = ();    }    ($currentkeyword, $currentvalue) = ('', ''); } #### Testausgabe! # use Data::Dumper; # print Dumper \%params; # exit; ############################################# # Jetzt wieder ausgeben! # Fuer alle Keywords for my $key (@{$params{keywords}}) {    # erst die freien Kommentare, falls vorhanden    if (exists $params{$key}{precomments}) {        print "# ", $_, "\n" for @{$params{$key}{precomments}};    }    # dann die einzelnen Schluessel und Werte    print "$key = ";    my @vals = ();    foreach my $val (@{$params{$key}{values}}) {        my $str = $val;        if (exists $params{$key}{comments}{$val}) {            $str .= "\t# " . join " \\\n\t\t\t# ", @{$params{$key}{comments}{$val}};        }        push @vals, $str;    }    print join " \\\n\t\t", @vals;    print "\n"; }