Patrick Schumacher: Wo muss ich hier etwas ändern?

Hi.

Ich habe hier ein Skript (von einem Bekannten). Das Skript liest aus einer Datei einige Daten aus und stellt diese in einer Tabelle dar.
Jetzt sind in der Tabelle einige Zellen leer. Diese hätte ich aber gerne mit   gefüllt. Wo muss ich in dem Skript etwas ändern, damit genau das passiert?

Richtig, ich kenne mich überhaupt nicht mit Perl aus, und viel Zeit habe ich auch nicht, um mich darin einzuarbeiten. Hätte ich Zeit würde ich es tun. Bitte sagt mir, wo ich etwas ändern muss.

Hier das Skript:

  
#!/usr/bin/perl  
@zeilen = ("");  
  
if(open(testdatei,"<../ahnentafel/stammbaum.txt")== false)  
{  
        print "Datei nicht gefunden";  
        die;  
}  
print "Content-type: text/html\n\n";  
print "<html><head><title>Personenregister</title></head>\n";  
print "<body><h2>Alle Namen</h2>\n";  
while(<testdatei>)  
{  
        push(@zeilen,$_);  
}  
close(testdatei);  
print "<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n";  
$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";  
for(@Liste)  
{  
  
        print "<tr>\n";  
        @felder = split(/;/,$Liste[$satz]);  
        $i=0;  
        for(@felder)  
        {  
                if ($satz == 0)  
                {  
                        print "<td>",$felder[$i],"</td>\n";  
                }  
                else  
                {  
            if($i == 0)  
            {  
                                print "<td>",  
                                "<a href=\"/cgi-bin/viewPers.pl?",$felder[$i],"\">",  
                                $felder[$i],  
                                "</a></td>\n";  
            }  
            else  
            {  
                print "<td>",$felder[$i],"</td>\n";  
            }  
    $i++;  
        }  
        }  
        print "</tr>\n\n";  
$satz++;  
}  
print "</table>";  
print "</body></html>\n";  

danke euch
euer Patrick

  1. Hej,

    Jetzt sind in der Tabelle einige Zellen leer. Diese hätte ich aber gerne mit &nbsp; gefüllt. Wo muss ich in dem Skript etwas ändern, damit genau das passiert?

    So schwer isses nicht: Die Zellen werden überall da gefüllt wo ein print $felder[$i] auftaucht.

    if ($satz == 0){
       print "<td>",$felder[$i],"</td>\n";
    }
    else{
       if($i == 0){
          print "<td>",
                  "<a href="/cgi-bin/viewPers.pl?",$felder[$i],"">",
                $felder[$i],
                "</a></td>\n";
       }
       else{
          print "<td>",$felder[$i],"</td>\n";
       }
       $i++;
    }

      
    Dein Abhilfe wäre alle  
    ~~~perl
      
      $felder[$i]  
    
    

    durch ein

      
      ($felder[$i] != "")? $felder[$i] : "&nbsp;"  
    
    

    zu ersetzen. Nachzulesen unter: http://de.selfhtml.org/perl/sprache/bedingt.htm.

    Beste Grüße
    Biesterfeld

    --
    "Nein! ... Nein, schneller, leichter, verführerischer die dunkle Seite ist."
    1. Hi

      Dein Abhilfe wäre alle

      $felder[$i]

      
      > durch ein  
      > ~~~perl
        
      
      >   ($felder[$i] != "")? $felder[$i] : "&nbsp;"  
      > 
      
      

      Das gibt mir in so ziemlich jeder Zelle, in der eigentlich etwas stehen sollte, ein &nbsp;. Komischerweise lässt er aber alle Zellen mit den Daten (hier: Mehrzahl von Datum) unberührt, sprich, da steht das drin was drin stehen solle.

      zu ersetzen. Nachzulesen unter: http://de.selfhtml.org/perl/sprache/bedingt.htm.

      Das werde ich mal zur Rate ziehen.

      Danke
      Patrick

  2. 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.

    1. Danke erstmal für deine Antwort.

      Nein, ich habe nichts für das Skript bezahlt. Er selber hat es auch aus dem Internet.

      Ich denke, die Abstimmung zu deinem Thread spricht ja Bände, doch ich muss da jetzt was dagegen sagen.

      Das hier (und sei es noch so gut):

      #!/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();

        
      ... gibt mir einen "Internal Server Error".  
        
      An deinem Code habe ich nichts verändert, ich habe ihn nur kopiert und eingefügt, als "read2.pl" abgespeichert, in den "cgi-bin" Ordner abgelegt und aufgerufen.  
      Woran kann das liegen? Für PHP gibts die Funktion phpinfo(), und für Perl gibts das auch, ich weiß nur nicht mehr wie diese Funktion heißt. Brauchst du das zur Problemfindung?  
        
      Danke aber trotzdem  
      Patrick
      
      1. ... gibt mir einen "Internal Server Error".

        An deinem Code habe ich nichts verändert, ich habe ihn nur kopiert und eingefügt, als "read2.pl" abgespeichert, in den "cgi-bin" Ordner abgelegt und aufgerufen.

        Hmmm, entweder du hast das Modul CGI nicht (was sehr unwahrscheinlich ist) pder die Rechte nicht nicht gesetzt oder die zeilenumbrüche sind falsch.

        Woran kann das liegen? Für PHP gibts die Funktion phpinfo(), und für Perl gibts das auch, ich weiß nur nicht mehr wie diese Funktion heißt. Brauchst du das zur Problemfindung?

        Nö gibt's nich. Das einzige weas du bversuchen kannst ist die Zeile:
        use CGI:Carp qw/fatalsToBrowser/;
        einbauen.

        Struppi.

        1. hi,

          Nö gibt's nich. Das einzige weas du bversuchen kannst ist die Zeile:
          use CGI:Carp qw/fatalsToBrowser/;
          einbauen.

          oder im error_log vom server nachschauen.
          Grüsse
          Alain