Thread Probleme mit Ausdrücken
(21 answers)
Opened by Trommelwirbel at 2011-11-10 17:05
Das Problem liegt in der Subroutine read_regio().
Dort wurde, wenn eine Zeile nur 2 Integer-Werte enthält, die Zeile ausgewertet und $regio und $lines auf die Integer-Werte gesetzt. Es fehlte die Prüfung, ob noch Zeilen übernommen werden müssen oder nicht. In diesem Fall wurden die Variablen auf 51 und 5 gesetzt. Für die nächste Zeile passte der Regex wieder und die Variablen werden dann mit 2 und 4 befüllt... Damit fällt die 51 raus, dafür dürfte ein Datensatz für die 2 auftauchen; oder evtl. einen bereits bestehenden Datensatz für die 2 erweitern. Hier mal eine überarbeitete Version: Code (perl): (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 82 #! /usr/bin/perl use strict; use warnings; ### sub routines ############################################################ sub read_elements { my $file = shift; my @elements; open my $infh, '<', $file or die "open(ro,$file) failed: $!\n"; while ( my $line = <$infh> ) { chomp $line; push @elements, substr( $line, 0, 4 ); } close $infh; return @elements; } # lese Regio-Datei ein; fuer jeden definierten Standort werden die ihm # nachfolgenden zeilen eingelesen # die gelesenen Daten werden in einem Hash-of-Arrays (HoA) abgelegt; als # Schluessel wird die Standort-Kennzahl verwendet, als Value wird eine # Referenz auf einen Array mit den Standortdaten abgelegt # siehe auch dokumentation: perldoc perldsc sub read_regio { my $file = shift; my %regio; my $regio = ''; my $lines = 0; my @values; open my $infh, '<', $file or die "open(ro, $file) failed: $!\n"; while ( my $line = <$infh> ) { chomp $line; # $regio/$lines nur setzen, wenn keine Zeile mehr zu lesen ist... if ( $lines == 0 && $line =~ m/^(\d+)\s+(\d+)$/ ) { $regio = $1; $lines = $2; } elsif ( defined( $regio ) && $lines > 0 ) { push @{ $regio{$regio} }, $line; $lines--; } } close $infh; return %regio; } ### main programm ########################################################### my @elements = read_elements( "elemente.txt" ); my %regio = read_regio( "hq_regio_neu.txt" ); # zur Kontrolle bei Entwicklung use Data::Dumper; print Data::Dumper->Dump( [ \@elements, \%regio ], [ qw( elements regio ) ] ); for my $element ( @elements ) { # weiter mit naechstem Element, wenn keine Daten vorhanden sind next if !exists $regio{$element}; my $file = "$element.txt"; # ueberschreibendes Schreiben open my $outfh, '>', $file or die "open(w, $file) failed: $!\n"; # anhaengendes Schreiben #open my $outfh, '>>', $file or die "open(w+, $file) failed: $!\n"; print $outfh join( "\n", @{ $regio{$element} } ); close $outfh or die "close(w+, $file) failed: $!\n"; } __END__ meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |