Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6022[/thread]

Datei lesen und in Hash schreiben? (Seite 4)

Leser: 2


<< |< 1 2 3 4 5 >| >> 46 Einträge, 5 Seiten
Dubu
 2004-01-20 13:41
#79272 #79272
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@Patrick: Was tut's an meiner Loesung nicht?
Patrick
 2004-01-20 13:48
#79273 #79273
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Bekomme irgendwie 'nen Systaxfehler!?

Quote
Syntaxfehler in Zeile 25 at test.pl line 49, <PARAM> line 25.


Hier mal der verwendete CODE
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
#!/usr/bin/perl
use strict;
use warnings;

my %params;

open PARAM, "/homes/Patrick/Perl/Tk/Project.bak" or die $!;

my $buffer = '';
while (<PARAM>) {
  # Kommentare loeschen
  s/\s*#.*?(\\?\n)/$1/;

  # Leerzeichen an Anfang und Ende loeschen
  s/^\s+//;
  s/\s+$//;

  # Zeile jetzt leer?
  unless (length) {
      # vorhandenen Buffer bearbeiten
      insert_keys (\$buffer, \%params);
      next;
  }

# Zeile merken
  $buffer .= $_;
  if ($buffer =~ /\\$/) {    # Fortsetzung folgt?
      # Fortsetzungszeichen durch Leerzeichen ersetzen
      chop $buffer; $buffer .= " ";
      next;
  }

  # Ein Satz zusammen => eintragen
  insert_keys (\$buffer, \%params);

}
# Falls die letzte Zeile noch ein Fortsetzungszeichen hatte ...
insert_keys (\$buffer, \%params);


use Data::Dumper;
print Dumper \%params;

#############################################
sub insert_keys {
  my ($bufferp, $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} = \@vals;
  } else {
      $paramp->{$key} = $val;
  }
  $$bufferp = "";
}

##########################################


Stell ich mich eventuell wieder zu dusselig an?

Trotzdem vielen Dank
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
Dubu
 2004-01-20 14:00
#79274 #79274
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Dann ist entweder ein Fehler in meinem Programm oder ein Fehler in deinen Parametern. :)
Die Fehlermeldung wird ausgegeben, wenn eine Zeile als Parameterzeile erkannt wird (alle Fortsetzungszeilen zusammen, alle Kommentare geloescht), aber dann kein '=' drin steht. Der Fehler passiert in deiner Parameterdatei in Zeile 25. Ist die denn identisch mit der, die du gepostet hast?
Patrick
 2004-01-20 14:15
#79275 #79275
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
OK.

Klappt, SUUUPPPPEEERRRR.

Vielen Lieben Dank an alle Helfer!

Die Fehler entstehen wenn ein Kommentar in die 2. zile Rutscht
Code: (dl )
1
2
3
4
5
6
.
.
BIN        = /homes/PPatrick/Perl              # Kommentar  Kommentar  Kommentar  
Kommentar   <- Problem

ETC       =  Parameter                             # Kommentar  Kommentar  Kommentar


Muss Die Vorlage halt dementsprechend abgeändert werden!

Nochmal Tausend Dank!
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
Patrick
 2004-01-20 14:24
#79276 #79276
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Nach welchen Schema werden denn die Einträge sortiert?

Kann man, ohne das ganze Programm umzufriemeln, die Kommantare in das Hash/Array reinschreiben?

1.000 Dank\n\n

<!--EDIT|Patrick|1074604251-->
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
Crian
 2004-01-20 15:10
#79277 #79277
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Patrick,20.01.2004, 12:26]Was mir wie gesagt Kopfzerbrechen bereitet, ist die Frage:
Wie erkenne ich wann eine "Liste" an Parametern kommt.[/quote]
Wie ich schon schrieb:
[quote=Crian,20.01.2004, 11:40]Die passende Vorgehensweise beim Einlesen ist dann folgende:

Vor Einleseschleife:

- leeres Arbeitsarray anlegen.

In der Einleseschleife (while (<IN>) { ... }):

- Aktuelle Zeile in Arbeitsarray kopieren.

- Wenn das letzte Zeichen der aktuellen Zeile nicht ein Backslash ist: Arbeitsarray auswerten, Hasheintrag erstellen, Arbeitsarray leeren. (Das Auswerten muss dann abhängig davon, ob das Arbeitsarray eine oder mehrere Zeilen enthält unterschiedlich erfolgen.)
[/quote]
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-01-20 15:11
#79278 #79278
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Interessieren die Kommentare dann jetzt doch nicht mehr???
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Patrick
 2004-01-20 15:27
#79279 #79279
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Wäre vielleicht besser wenn sie drinnen sind.

Die Lösung von Dubu ist klasse, aber die Kommentare werden weggeschnitten.
Das müsste ich noch umgehen!

Hier erst mal der Code

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
77
78
79
80
81
#!/usr/bin/perl
use strict;
use warnings;

my %params;

open PARAM, "/homes/Patrick/Perl/Tk/Project2.bak"
or die $!;

my $buffer = '';
while (<PARAM>)
{
# Kommantar rausholen
  my (@splitter1);
  @splitter1 = split(/#/ , $_);

# Kommentare loeschen
  s/\s*#.*?(\\?\n)/$1/;

# Leerzeichen an Anfang und Ende loeschen
  s/^\s+//;
  s/\s+$//;

# Zeile jetzt leer?
  unless (length)
  {     # vorhandenen Buffer bearbeiten
      insert_keys (\$buffer, \%params);
      next;
  }

# Zeile merken
  $buffer .= $_;
  if ($buffer =~ /\\$/)   # Fortsetzung folgt?
  {
# Fortsetzungszeichen durch Leerzeichen ersetzen
      chop $buffer; $buffer .= " ";
      next;
  }

# Ein Satz zusammen => eintragen
  insert_keys (\$buffer, \%params, @splitter1[1]);

}
# Falls die letzte Zeile noch ein Fortsetzungszeichen hatte ...
insert_keys (\$buffer, \%params);


use Data::Dumper;
print Dumper \%params;

#############################################
sub insert_keys
{

# An dieser Stelle müsste noch die Kommantare mit eingetragen werden

  my ($bufferp, $paramp, $komment) = @_;  # Kommentare müssen mit

  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} = \@vals;
  }
  else
  {
      $paramp->{$key} = $val;
  }
  $$bufferp = "";
}
##########################################
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
Dubu
 2004-01-20 15:38
#79280 #79280
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ups, da habe ich wohl die Specs nicht richtig gelesen. ;)

Dann habe ich aber noch Fragen:
- Soll jeder Kommentar zu jeden Wert einzeln abgespeichert werden oder gesammelt fuer jeden Schluessel?
- Was ist mit mehrzeiligen Kommentaren? Gehoeren die immer zum letzten Wert?
- Was ist mit Kommentaren, die nicht hinter Werten stehen?
Patrick
 2004-01-20 15:49
#79281 #79281
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Am günstigsten wäre es wohl, wenn Die Datei so wieder rauskommt, wie man sie gelesen hat.
Abgesehen von den veränderten Werten.

Wäre eine Idee die Kommentare, die schon ausgegeben wurden zu löschen, damit diese nicht nochmal drankommen bei z.B. Listen.

Bei Mehrzeiligen Kommentaren kann man diese mit einem # vorweg in die nächste Zeile schreiben.

Kommentare die nicht hinter Werten stehen?

Wenn Du damit sowas
Code: (dl )
1
2
3
#
# Kommentar
#


meinst, kein Problem. Ich glaube es reicht auch, wenn ich diese Sachen später einfüge!
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
<< |< 1 2 3 4 5 >| >> 46 Einträge, 5 Seiten



View all threads created 2004-01-18 22:12.