Thread die frage nach der ursache eines fehlers ...
(5 answers)
Opened by jan999 at 2009-11-11 19:24
Vorweg:
Das beigefügte Beispiel ist nicht über Tabs getrennt, hat das einen bestimmten Grund? Erstens: Beim print das "\n" nicht vergessen, sonst puffert das Perl intern und du siehst erst was am ende Programms, oder wenn der Puffer voll ist, oder wenn das nächste mal "\n" ausgeben werden soll. Zweitens: es währe schön wenn du die in der Funktion genutzeten werte an die Funktion übergeben würdest. Drittens: die Konstruktion Code (perl): (dl
)
1 2 3 4 5 6 7 if ($count != 0) { #... } else { # einfache Datenweitergabe der Kopfzeile print $out $_."\n"; } du kannst vor dem "while" nach dem öffnen der Dateien einfach schreiben Code (perl): (dl
)
print $out <$in>; Viertens: Das beim "open" angewöhnen immer die drei-Parameter-Form zu verwenden. in "$osmolt_file" könnte ja auch stehen "> /pfad/zu/einer/wichtigen/datei" dann würde sie gelöscht. nicht schön oder? Fünftens: Das Filehandle sollte immer eine Variable sein. Sechstens: Du kannst Werte mittels "return" au der Funktion zurück liefern. Damit hättest du Funktion komplett von globalen werten entkoppelt, das macht das Wiederverwenden einfacher. Und hier die ü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 #!/usr/bin/perl use strict; use warnings; # Parser einbinden my ($desc,$count_lines)=ReadData($ARGV[0],$ARGV[1]); # Filter anlegen sub ReadData { my $osmolt_file=shift; my $result_file=shift; my $desc = ''; my $count=0; #Filterdatei oeffnen open( my $in, '<', $osmolt_file ) || die( "Can't open $osmolt_file: $!" ); open( my $out, '>', $result_file) || die( "Can't open $result_file: $!" ) ; # einfache Datenweitergabe der Kopfzeile print $out <$in>; #fuer jede Zeile while( my $line=<$in> ) { chomp($line); # Newlines loeschen $line=~s/^\s+//; # fuehrende Leerzeichen entfernen $line=~s/\s+$//; # nachfolgende Leerzeichen entfernen next if( $line=~/^#/ ); # Kommentare ueberspringen next if( $line=~/^s*$/ ); # Leerzeilen ueberspringen #Zeile auftrennen my($point,$title,$attributes,$icon,$icon_size,$iconOffset) = split( /\t/, $line, 7 ); print "$point - $attributes * \n"; print "$attributes\n"; if ($attributes ne '') { $desc="<i>Es liegen Daten vor !!!!</i>"; } else { $desc="<i>keine Leerungszeiten vorliegend!</i>"; } print $out "$point\t$title\t$desc\t$icon\t$icon_size\t$iconOffset\n"; $count++; }# end-while close($in); close($out); return($desc,$count); } |