Struppi: Wo muss ich hier etwas ändern?

Beitrag lesen

Ich habe hier ein Skript (von einem Bekannten). Das Skript liest aus einer Datei einige Daten aus und stellt diese in einer Tabelle dar.

Du hast hoffentlich nichts dafür bezahlt, das Skript mißachtet so ziemlich alles was in einem so kurzen Skript zu mißachteten ist.

Hier das Skript:

#!/usr/bin/perl

Warnungen und use strict sollten immer verwendet werden.

#!/usr/bin/perl -w
use strict;

@zeilen = ("");

Damit wird eine leere zeile erzeugt, das ist kaum im Sinne des Programmablaufs.

my @zeilen;

if(open(testdatei,"<../ahnentafel/stammbaum.txt")== false)
{
        print "Datei nicht gefunden";
        die;
}

Das Schlüßelwort false existiert in Perl nicht. Filehandle werden üblicherweise gross geschrieben. Das ganze läßt sich so zusammenfassen und inklusive einer aussagekräftigeren Fehlermeldung:

open  FH, "<../ahnentafel/stammbaum.txt" ||
die "Datei kann nicht geöffnet werden, weil: $!";

print "Content-type: text/html\n\n";

Dies sollte vor der obigen Zeilen passieren, da ansonsten die Fehlermeldung im Browser nie angezeigt würde. Die verwendung des CGI Modul wäre aber angeraten.

print "<html><head><title>Personenregister</title></head>\n";
print "<body><h2>Alle Namen</h2>\n";

while(<testdatei>)
{
        push(@zeilen,$_);
}

Die läßt sich zu einem einzeiler zusammenfassen:

my @zeilen = <FH>;

close(testdatei);

close FH;

print "<table border="1" cellspacing="0" cellpadding="2">\n";
$satz=0;

my $satz = 0;

@Liste = sort @zeilen;
    print "<tr>\n";
        print "<td>","ID","</td>\n";
        print "<td>","Name","</td>\n";
        print "<td>","Vorname","</td>\n";
        print "<td>","2.Vorname","</td>\n";
        print "<td>","geborene","</td>\n";
        print "<td>","geboren am","</td>\n";
        print "<td>","Land","</td>\n";
        print "<td>","Ort","</td>\n";
        print "<td>","gestorben am","</td>\n";
        print "<td>","Land","</td>\n";
        print "<td>","Ort","</td>\n";
        print "<td>","VaterID","</td>\n";
        print "<td>","MutterID","</td>\n";
                print "<td>","PIC","</td>\n";
                print "<td>","Bemerkung","</td>\n";
        print "<td>","Ehepartner","</td>\n";
        print "<td>","Hochzeitsdatum","</td>\n";
        print "</tr>\n";

Hier wäre das th Element angebrachter mit Hilfe des CGI Moduls könnte man das ganze auch wesentlich schöner umsetzen.

print CGI::Tr( CGI::th(
[ qw/ID Name Vorname 2.Vorname geborene geboren&nbsp;am Land Ort
        gestorben&nbsp;am Land Ort VaterID MutterID PIC Bemerkung Ehepartner Hochzeitsdatum
/]
));

for(@Liste)
{

foreach( sort @zeilen)

spart ein komplettes Array, was je nach Dateigröße eine Menge ausmachen kann.

print "<tr>\n";
        @felder = split(/;/,$Liste[$satz]);

my @felder = split(/;/, $_);

$i=0;

unnötig!
Genau wie die ganze nachfolgende Schleife.

my $person = shift @felder ;
print CGI::Tr( CGI::td( [
CGI::a( {-href => "/cgi-bin/viewPers.pl?$person"}, $person),
map {'&nbsp;' unless $_}  @felder
]));

$satz++;
}
print "</table>";
print "</body></html>\n";

  
Zusammengefaßt könnte das ganze so aussehen:  
~~~perl
  
#!/usr/bin/perl -w  
use strict;  
use CGI;  
  
print CGI::header();  
print CGI::start_html(-title => 'Personenregister');  
  
open  FH, "<../ahnentafel/stammbaum.txt" or die "Datei kann nicht geöffnet werden, weil: $!";  
my @zeilen = <FH>;  
close FH;  
  
print CGI::h2('Alle Namen');  
print CGI::start_table({-border => 1, -cellpadding => 2, -cellspacing => 0 });  
print CGI::Tr( CGI::th(  
[ qw/ID Name Vorname 2.Vorname geborene geboren&nbsp;am Land Ort  
        gestorben&nbsp;am Land Ort VaterID MutterID PIC Bemerkung Ehepartner Hochzeitsdatum  
/]  
));  
  
foreach( sort @zeilen)  
{  
    my @felder = split(/;/, $_);  
    my $person = shift @felder ;  
    print CGI::Tr( CGI::td( [  
    CGI::a( {-href => "/cgi-bin/viewPers.pl?$person"}, $person),  
    map {'&nbsp;' unless $_}  @felder  
    ]));  
  
}  
  
print CGI::end_table(), CGI::end_html();  

Struppi.