ich konnte den code nicht lesen und hab einige vorsintflutliche konstrukte und sonstige sünden ausgemerzt.
inkonsequentes einrücken (mal sind schleifen auf derselben ebene eingerückt, manchmal nicht, hier werden tabs benutzt, dort spaces), c-style-for-loops, die im gegensatz zu perligen loops dermassen unlesbar sind, fehlende my() ergänzt, wo ich sie setzen konnte, ein paar lerzeichen zwischen kommata und gleichheitszeichen, damit man auch wirklich was erkennen kann (code wird um ein vielfaches mehr gelesen als geschrieben!), echte tabs in regexes durch \t ersetzt, sonst erkennt man ja gar nicht, ob es ein tab oder spaces sein sollen, zeilen über 80 zeichen verkürzt.
lies bitte unbedingt Perl Best Practices. Je früher desto besser. Ist wirklich gold wert.
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
89
90
91
92
93
# Aufspalten der Parameter (Headerzeile) in Spalten
my @Cruise_Zeile = split /\t/, $Cruise_Zeile_ges;
for my $i (0 .. $#Cruise_Zeile){
print "$i $Cruise_Zeile[$i]\n";
}
#suchen der wichtigen Parameter (Tiefe, Datum, Wert)
my $D_spalte;
for my $i (0 .. $#Cruise_Zeile) {
$D_spalte = $i, last if $Cruise_Zeile[$i] =~ /Depth /;
}
$D_QV = $D_spalte + 1;
# die Zeitspalte steht 2 Spalten vorher!
$Z_spalte = $D_spalte - 2; # DATUM/ZEIT (Format 2009-01-21T11:00:00)
# Suchen nach den Parametern
for my $i ($D_QV .. $#Cruise_Zeile) {
if ($Cruise_Zeile[$i] =~ /Temperature/) {
$temp_index = $i;
last;
}
}
for my $i ($D_QV .. $#Cruise_Zeile) {
if ($Cruise_Zeile[$i] =~ /Salinity/) {
$sali_index = $i;
last;
}
}
# aus @aktzeile ein 2-dim Feld machen
foreach my $zz (@stationsdaten) {
my @hilf = split /\t/, $zz;
push @aktzeile, [@hilf];
}
# Zeitreihen fuer die einzelnen Parameter basteln
# TEMPERATUR
for my $l (0 .. $#stationsdaten) {
# die Zeitreihe der Temperaturen befindet sich in
push @zr_temp, $aktzeile[$l]->[$temp_index];
}
# Schleife durch alle Parameter machen und die QVs setzen
# aktzeile wird immer komplett mit reingegeben
# ZEIT TIEFE WERT
@QV_neu = sub_QC_temp($Z_spalte, $D_spalte, $temp_index);
for my $l (0 .. $#stationsdaten) {
$aktzeile[$l]->[$temp_index+1] = $QV_neu[$l]
} # neue QVs setzen
# wegschreiben der Zeilen,
# vorher wurden die neuen QVs eingesetzt
for my $i (0 .. $#stationsdaten - 1) {
for my $l (0 .. $#Cruise_Zeile) {
printf OUT_DATEI "%+s\t", $aktzeile[$i]->[$l];
}
printf OUT_DATEI "%+s\n", $aktzeile[$#stationsdaten]->[$#Cruise_Zeile];
}
close OUT_DATEI;
########## ende MAIN
# EINLESEN DES REFERNZDATENSATZ und splitten nach Parameter
# (er liegt in folgender Struktur vor:)
#Param Tiefe Monat mean N Sigma Min Max
# TEMP; 2; 01; 4.18; 4235; 1.45; 0.73; 7.07
# TEMP; 2; 02; 2.70; 4056; 1.29; 0.14; 5.35
# TEMP; 2; 03; 2.40; 5135; 1.30; 0.19; 5.22
open my $eingang, '<', $dest_dir.$filename or die "can't open $filename: $!\n";
my ($bla, @klimatol);
while (<$eingang>) {
$bla++ if /^\s/;
push @klimatol, $_ if $bla;
}
close $eingang;
print @klimatol, "\n";
my @datenz;
foreach (@klimatol) {
chomp;
$_=~ s/ //g;
my ($Param, $Tiefe, $Monat, $mean, $N, $sigma, $Min, $Max) = split /;/;
push @datenz, join ';',
$Param, $Tiefe, $Monat, $mean, $N, $sigma, $Min, $Max, "\n";
}
das wäre vielleicht der erste schritt, so ein refactoring durchzuführen und dann erst weitere funktionalitat einzuführen.
Last edited: 2010-07-28 12:41:27 +0200 (CEST)