Thread die frage nach der ursache eines fehlers ... (5 answers)
Opened by jan999 at 2009-11-11 19:24

topeg
 2009-11-11 22:53
#128141 #128141
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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";
}
Ist nicht nötig
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);
}

View full thread die frage nach der ursache eines fehlers ...