Christoph Schnauß: Tabelle vollständig generieren

hallo Forum ;-)

Ich bin seit mehreren Tagen dabei, meine "alten" Perl-Scripte zu "modernisieren". Ein Haufen Tipparbeit ...
Dabei bin ich zwar über einen Berg kleinere und größere Problene gestolpert, aber nur eines konnte ich bisher nicht auflösen. Es geht um die Einbindung des CGI-Moduls in der Form

use strict;
use CGI;
my $my = new CGI;

und um das Generieren von HTML-Seiten. Normalerweise funktiuoniert das ja wunderbar, bloß mit Tabellen bekomme ich Probleme. Folgendes Beispiel:

sub keine_eingabe {
print $my->header(),"\n",
      $my->start_html(-title =>'keine Eingabe',
                 -style =>{'src'=>'http://www.meine_adresse.de/allgemein.css','\n'},
                ),"\n",
      $my->start_table({-width =>'80%'}),"\n",
      $my->start_td({-colspan =>'2'}),"\n",
      $my->h3('Fehler:<br>Es wurde nichts angegeben'),"\n",
      $my->p('der Text fehlt ;-)<br>bitte Text eingeben und erneut absenden'),"\n",
      $my->end_td(),"\n",
      $my->end_table(),"\n",
      $my->end_html();
exit;
}

In dieser Form macht das keine Mühe, ist bloß nicht "vollständig". Denn: da fehlt das <tr>, und _genau_darum_ gehts mir. Ich möchte (muß) meine generierte Tabelle in zwei Spalten aufteilen, was dann in der zweiten Tabellenzeile erfolgen soll. Rechte Spalte für ein paar Eingabefelder (textfields und buttons), linke Spalte für Hinweise. Aber aus irgendeinem Grund fehlt bei dieser Art der Notierung die Möglichkeit, mit

$my->tr()

irgendwas auszurichten. Ich verstehe nicht, warum das mit $my->td() funktioniert, aber nicht mit $my->tr(), schließlich möchte ich nicht sämtliche Tabellenzellen nebeneinander stellen.

Hat jemand nen Hinweis?

Ähm, ehe jetzt irgendwer "perldoc CGI" oder ähnliches rät: das hab ich bereits alles ziemlich grundlich gelesen. In meinen "alten" Scripts hatte ich sowas stehen:

sub keine_eingabe {
   print "Content-Type: text/html\n\n";
   print "<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252">\n";
   print "<title>keine Eingabe</title>\n";
   print "<link rel="stylesheet" type="text/css" href="http://www.meine_adresse.de></head>\n";
   print "<body>";
   print "<table width="80%">";
   print "<tr><td colspan="2"><h3>Fehler
   ...

das funktioniert ja auch weiterhin, und _hier_ kriege ich meine <tr>'s auch generiert. Warum klappt das nun nicht in der "moderneren" Schreibweise?

Grüße aus Berlin

Christoph S.

  1. Hallo Christoph,

    Aber aus irgendeinem Grund fehlt bei dieser Art der Notierung die
    Möglichkeit, mit
       $my->tr()
    irgendwas auszurichten.
    Hat jemand nen Hinweis?

    Ähm, ehe jetzt irgendwer "perldoc CGI" oder ähnliches rät:
    das hab ich bereits alles ziemlich grundlich gelesen.

    ... auch das hier?

    "Because of conflicts with built-in Perl functions,
     the following functions begin with initial caps:
        Select
        Tr
        Link
        Delete"

    (aus CGI.pm)

    Viele Grüße
          Michael
    (der diese komische HTML-tag-API nie benutzen würde, aber neugierig war)

    1. lieber Michael .... *g*

      ja, auch das hab ich gelesen, und auch sas hat nix geholfen

      Christoph S.

      1. Hallo,

        ja, auch das hab ich gelesen, und auch sas hat nix geholfen
        Christoph S.

        <img src="/images/14.gif" width=260 height=119 border=0 alt="Ein bischen dumm?">

        Jens

  2. Hallo,

    Ein bsp von http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm

    print table({-border=>undef},
            caption('Wann sollten Sie Gemüse essen?'),
            Tr({-align=>CENTER,-valign=>TOP},
            [
               th(['Gemüse', 'Frühstück','Mittagessen','Abendessen']),
               td(['Tomaten' , 'nein', 'ja', 'ja']),
               td(['Broccoli' , 'nein', 'nein',  'ja']),
               td(['Zwiebeln'   , 'ja','ja', 'ja'])
            ]
            )
         );

    Ich denke mal das sollte dir weiterhelfen.

    Gruss
    Andreas

    1. hallo Andreas,

      Ein bsp von http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm
      Ich denke mal das sollte dir weiterhelfen.

      das tut es leider nicht. Dasselbe Beispiel bekomme ixh übrigens mit perldoc CGI auch zu sehen. Aber aus irgendeinem Grund wird dieses Beispiel nicht befolgt.

      Grüße aus Berlin

      Christoph S.

      1. Hallo Christoph,

        das tut es leider nicht.

        Das ist natuerlich eine *sehr* detailierte Problem-Beschreibung.

        Aber aus irgendeinem Grund wird dieses Beispiel nicht befolgt.

        Heisst?

        Das Beispiel funktioniert einwandfrei. Du musst also irgendetwas falsch
        machen. In deinem Beispiel-Code war es ja das komplette Fehlen von
        jeglichem Code, dass das <tr> haette generieren koennen.

        Was hast du denn bisher probiert? Welche Probleme traten auf? Etc,
        etc -- du solltest die Fragen doch eigentlich kennen :)

        Gruesse,
         CK

        1. hi Christian,

          das tut es leider nicht.
          Das ist natuerlich eine *sehr* detailierte Problem-Beschreibung.

          das ist überhaupt keine Problembeschreibung, sondern die Antwort auf den Satz:

          Ich denke mal das sollte dir weiterhelfen.

          Aber aus irgendeinem Grund wird dieses Beispiel nicht befolgt.
          Heisst?

          heißt, daß ich den Grund noch suchen mußte und nicht genauer angeben konnte.

          In deinem Beispiel-Code war es ja das komplette Fehlen von
          jeglichem Code, dass das <tr> haette generieren koennen.

          weil ich Fehlermeldungen bekam, sobald ich "$my->tr()" oder auch "$my->Tr()" in meinen Code eingebaut hatte. Der zitierte Codeschnipsel sollte wenigstens funktionieren, auch wenn die erzeugte "Tabelle" nur eine Krücke war.

          Im übrigen war Michael mit seinem Hinweis näher an einer Problemlösung dran. Solange ich nur "use CGI;" vorgebe, kann das von Andreas zitierte Beispiel sowieso nicht funktionieren, da es "use CGI ':standard';" verlangt.

          Was hast du denn bisher probiert?

          Ich habe das Script, um das es mir ging, heute nicht auf einem WINDOWS-Rechner laufen lassen, sondern mit meiner FreeBSD-Maschine aufgerufen - auf die Idee komme ich auch nicht immer. Da funktionierte es völlig problemlos (unter Beachtung der Schreibweise "Tr". auf die Miachael aufmerksam gemacht hat). Die einzig mögliche Schlußfolgerung war, auf dem Windows-Rechner, den ich gestern benutzt hatte, die PERL-Installation zu revidieren.

          Und das wars dann. Problem beseitigt.

          Grüße aus Berlin

          Christoph S.

          1. Hallo Christoph,

            das ist überhaupt keine Problembeschreibung, sondern die Antwort auf den Satz:

            Das wollte ich damit anmerken :)

            weil ich Fehlermeldungen bekam, sobald ich "$my->tr()" oder auch "$my->Tr()" in meinen
            Code eingebaut hatte.

            *Welche* denn? :)

            Der zitierte Codeschnipsel sollte wenigstens funktionieren, auch wenn die erzeugte
            "Tabelle" nur eine Krücke war.

            Ja, sollte es, sofern du CGI.pm mit qw/:all/ oder so eingebunden hast.

            Im übrigen war Michael mit seinem Hinweis näher an einer Problemlösung dran. Solange ich
            nur "use CGI;" vorgebe, kann das von Andreas zitierte Beispiel sowieso nicht
            funktionieren, da es "use CGI ':standard';" verlangt.

            Natuerlich. Hat ja auch keiner bestritten, aber du hast ja die Objekt-Orientierte Variante
            benutzt, in deinem Beispiel. Ich war natuerlich davon ausgegangen, dass du die
            Transfer-Leistung (funktional <-> OO) selber hinbekommst -- und wie du siehst, habe ich mich
            nicht geirrt :)

            Da funktionierte es völlig problemlos (unter Beachtung der Schreibweise "Tr". auf die
            Miachael aufmerksam gemacht hat). Die einzig mögliche Schlußfolgerung war, auf dem
            Windows-Rechner, den ich gestern benutzt hatte, die PERL-Installation zu revidieren.

            Welche Perl-Version, welche CGI.pm-Version (perl -v und perl -MCGI -e 'print $CGI::VERSION).

            Gruesse,
             CK, verbotenerweise hier :)

            1. guten Abend,

              Welche Perl-Version

              This is perl, v5.6.1 built for MSWin32-x86-multi-thread.
              Das war es vorher auch schon.

              , welche CGI.pm-Version
              $CGI::revision = '$Id: CGI.pm,v 1.49 2001/02/04 23:08:39 lstein Exp $';
              $CGI::VERSION='2.752';
              steht in der CGI.pm. Ob das dieselbe ist, die ich auch gestern hatte, weiß ich nicht.

              CK, verbotenerweise hier :)

              verbotenerweise ?

              Grüße aus Berlin

              Christoph S.

              1. Tag Christoph,

                Welche Perl-Version
                This is perl, v5.6.1 built for MSWin32-x86-multi-thread.

                Wie -- noch kein Perl 5.8.0? :) (http://dev.perl.org/perl5/news/2002/07/18/580ann/)

                $CGI::VERSION='2.752';

                Damit geht das in jedem Fall -- meine eigene Version ist ein ganzes
                Stueck aelter :)

                steht in der CGI.pm. Ob das dieselbe ist, die ich auch gestern
                hatte, weiß ich nicht.

                Schade.

                CK, verbotenerweise hier :)
                verbotenerweise ?

                Japp -- ich hatte eigentlich Self-Ferien versprochen *g*

                Gruesse,
                 CK

                1. hi,

                  Wie -- noch kein Perl 5.8.0? :) (http://dev.perl.org/perl5/news/2002/07/18/580ann/)

                  habs mir für FreeBSD geholt, aber noch nicht installiert  -  und für meine WinXP-Maschine will ich abwarten, bis es etwas Entsprechendes bei ActiveState gibt

                  Japp -- ich hatte eigentlich Self-Ferien versprochen *g*

                  ok, ich sags auch nicht weiter

                  Grüße aus Berlin

                  Christoph S.