Thread Probleme mit Ausdrücken (21 answers)
Opened by Trommelwirbel at 2011-11-10 17:05

Linuxer
 2011-11-15 21:47
#154221 #154221
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
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:

more (17.2kb):

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!

View full thread Probleme mit Ausdrücken