Thread Mustersuche
(18 answers)
Opened by la_dy82 at 2010-12-08 17:59
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! |