Thread Mustersuche (18 answers)
Opened by la_dy82 at 2010-12-08 17:59

Linuxer
 2010-12-08 20:10
#143418 #143418
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Welche Herausforderung meinst Du nun? Jene, die vielen if-Bedingungen zu reduzieren?

Hier mal ein Beispiel, wie man das lösen könnte:

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
83
84
85
86
87
88
#! /usr/bin/perl
# vim:ts=4 sw=4 sts=4 et nu fdc=3:
use strict;
use warnings;

my $spalte = 3;

#> Variante der Einzelverarbeitung

my $summe;
my $schwelle = 31.0;
my $zuviele = 0;

my $position = tell(DATA);  # fuer demo zwecke, weil wir aus DATA Sektion lesen

while ( my $zeile = <DATA> ) {
    chomp $zeile;

    # hoffentlich keine Whitespaces in den Daten...
    my @spalten = split m{\s+}, $zeile;

    # verarbeite nur gewuenschte Spalte
    $summe += $spalten[$spalte-1];

    # zaehle, wie oft $spalte die $schwelle ueberschritten hat
    $zuviele++  if $spalten[$spalte-1] > $schwelle;
}

print "Die Summe der Spalte $spalte beträgt: $summe\n";
print "Dabei waren $zuviele Werte größer als $schwelle\n";


#> Variante der Sammelverabeitung

print "-------8<---------\n";
seek(DATA,$position,0);  # fuer demo zwecke, weil wir aus DATA Sektion lesen; Handle-Position zuruecksetzen

my %summe;
my %zuviele;
my %schwelle = (
    # Spalten-Nr => Schwellwert
    1   => 35000,
    2   => 30.0,
    3   => 31.0,
    # ...
);


while ( my $zeile = <DATA> ) {
    chomp $zeile;

    # hoffentlich keine Whitespaces in den Daten...
    my @spalten = split m{\s+}, $zeile;

    # verarbeite alle Spalten; Array-Index beginnt bei 0, 
    # daher wird $idx+1 als Hash-Key genutzt, um wieder als Spaltenangabe zu dienen
    for my $idx ( 0 .. $#spalten ) {
        # Summe pro Spalte
        $summe{$idx+1}     += $spalten[$idx];
        # zaehle Schwellwertueberschreitungen pro Spalte
        $zuviele{$idx+1}++     if exists $schwelle{$idx+1} && $spalten[$idx] > $schwelle{$idx+1};
    }
}

# alles ausgeben
#for my $spalte ( sort keys %summe ) {
#    print "Die Summe der Spalte $spalte beträgt: $summe{$spalte}\n";
#    if ( exists $schwelle{$spalte} && exists $zuviele{$spalte} ) {
#        print "Dabei waren $zuviele{$spalte} Werte größer als $schwelle{$spalte}\n";
#    }
#}

# nur gewünschte Spalte ausgeben
print "Die Summe der Spalte $spalte beträgt: $summe{$spalte}\n";
if ( exists $schwelle{$spalte} && exists $zuviele{$spalte} ) {
    print "Dabei waren $zuviele{$spalte} Werte größer als $schwelle{$spalte}\n";
}


__DATA__
32161   28.0    31.0    38.0    36.0    37.0    4245    1.12    1.9
32164   27.0    31.0    38.0    36.0    37.0    4245    1.12    1.9
32167   27.0    31.0    38.0    36.0    37.0    4219    1.12    1.9
32170   27.0    31.0    38.0    36.0    37.0    4219    1.12    1.9
32173   27.0    31.0    38.0    36.0    37.0    4219    1.12    1.9
32176   27.0    31.0    38.0    36.0    37.0    4219    1.12    1.9
32179   27.0    32.0    38.0    36.0    39.0    4245    1.12    1.9
32182   27.0    32.0    38.0    36.0    37.0    4245    1.12    1.9
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 Mustersuche