kaepten: HTML Datei dynamisch mit -print... - erzeugen

Wie habt Ihr das "Problem" gelöst, wenn ihr eine HTML Seite in Perl dynamisch ausgeben wollt?

Ausgangslage:
Ich habe eine HTML codierte Seite mit x-beliebigen Tags.

Problem:
Ich will genau diese Seite via Perl (print - Befehl) (quasi-)dynamisch erzeugen.

Vorgehen:
Vor jede Zeile HTML-code und am Ende der Zeile
print "... bzw ...\n"; setzen.
Allen Gänsefüsschen \ voransetzen (und was noch?)

Ich habe das mehrmals mühsam von Hand gemacht, hat jemand einen Tipp, wie man das ein wenig "automatisieren" könnte??

  1. Wie habt Ihr das "Problem" gelöst, wenn ihr eine HTML Seite in Perl dynamisch ausgeben wollt?

    Ausgangslage:
    Ich habe eine HTML codierte Seite mit x-beliebigen Tags.

    Problem:
    Ich will genau diese Seite via Perl (print - Befehl) (quasi-)dynamisch erzeugen.

    Vorgehen:
    Vor jede Zeile HTML-code und am Ende der Zeile
    print "... bzw ...\n"; setzen.
    Allen Gänsefüsschen \ voransetzen (und was noch?)

    Ich habe das mehrmals mühsam von Hand gemacht, hat jemand einen Tipp, wie man das ein wenig "automatisieren" könnte??

    Hi,

    probiers doch mal mit (use CGI.pm):

    print<<HTML;
       ....
       Hier den ganz normalen HTML-Code, wenn es sein muß
       sogar mit Perl-Variablen
       ....
    HTML

    Gruß Jörg

    1. Hi!

      print<<HTML;

      Also zumindest die mir bekannten Perl-Versionen mögen das *so* nicht...
      Entweder
        print<<'HTML';
      dann werden Sonderzeichen ($,",',...) nicht interprediert, also auch keine Variablen ausgegeben. (Ist bei print 'kostet viele $$$s'; genauso).
      oder
        print<<"HTML";
      dann werden die Sonderzeichen wie gewohnt interprediert, müssen also ggf. mit "" gequoted werden.

      Ciao,
      Mirko

      1. Hi!

        Noch ein kleiner Nachtrag:
        Das HTML (oder wie du die Ende-Kennzeichnung auch genannt hast) muß unbedingt am Anfang der Zeile stehen (also keine Einrückungen!) und darf auch keine Leerzeichen dahinter haben! Sonst interprediert Perl alles bis zum Dateiende als Text für den print.

        Übrigens kann man das überall verwenden, wo Strings erlaubt sind, also auch z.B.
        &meinefunktion(<<'ENDE','blabla');
        Dieser Text wird
        an die Funktion
        &meinefunktion()
        übergeben
        ENDE

        Ciao,
        Mirko

        1. Hi!

          Auch hi,

          Noch ein kleiner Nachtrag:
          Das HTML (oder wie du die Ende-Kennzeichnung auch genannt hast) muß unbedingt am Anfang der Zeile stehen (also keine Einrückungen!) und darf auch keine Leerzeichen dahinter haben! Sonst interprediert Perl alles bis zum Dateiende als Text für den print.

          Stimmt.

          Übrigens kann man das überall verwenden, wo Strings erlaubt sind, also auch z.B.
          &meinefunktion(<<'ENDE','blabla');
          Dieser Text wird
          an die Funktion
          &meinefunktion()
          übergeben
          ENDE

          Ciao,
          Mirko

          Ich verwende Perl 5.005_02 auf SuSE 6.0 und da läuft folgendes wie Sau:

          ----------snip---------------
          #!/usr/bin/perl -w

          use CGI qw(:standard);
          use CGI::Carp qw(fatalsToBrowser);
          use lib '.';
          use MO qw(:STANDARD);
          use MO qw(:VARIABLES);

          ############

          Moegliche Funktionen:

          print: header, end_hmtl

          sonstige: param, ...

          ############

          CGI zur Erzeugung der Stammdatenübersicht

          ############
          #Labels und sonstige Bezeichnungen
          @labels = ("Zurück", "Stammdatenübersicht", "Hilfe", "Kundenstammdaten","Hotelstammdaten", "Reisestammdaten","Mitarbeiter", "...");

          $session = param('session');
          $port    = param('port');

          print header;
          print_html();
          print end_html;

          exit(0);

          ############
          #Anzeigen der Stammdatenübersicht
          ############
          sub print_html
          {
            print <<KOPF;
              <HEAD>
                <meta http-equiv="expires" content="0">
                <TITLE>Stammdatenübersicht</TITLE>
              </HEAD>
                <BODY bgcolor="#c0c0c0">
                    <TABLE border="0" cellspacing="1" cellpadding="1" style="FONT-SIZE: x-small">
                   <TD width="10%"><A href="/cgi-bin/mo/log.cgi?port=$port&session=$session">$labels[0]</A>
                   <TD width="100">$labels[1]
                          <TD width="85%" align="right"><A href="/mo/help/MO_Übersicht.html#stammdaten" target="_blank">$labels[2]</A>
                   </TABLE> <HR>

          Bitte gewünschte Funktion durch Mausklick auswählen: <p>
          <table width="100%" style="FONT-SIZE: x-small" border rules=cols frame=void>
             <tr>
               <td width="20%"><b>$labels[3]</b>
               <td width="20%"><b>$labels[4]</b>
               <td width="20%"><b>$labels[5]</b>
               <td width="20%"><b>$labels[6]</b>
               <td width="20%"><b>$labels[7]</b>
               <td width="20%">
             <tr>
               <td><A href="/cgi-bin/mo/s_kd.cgi?port=$port&session=$session&maske=2">Kunden-Verwaltung</a>
               <td><A href="/cgi-bin/mo/s_ho.cgi?port=$port&session=$session&maske=2">Hotel-Verwaltung</a>
               <td>
               <td>Mitarbeiterverwaltung
               <td>
             <tr>
               <td><hr>
               <td><hr>
               <td><hr>
               <td><hr>
               <td><hr>
               <td><hr>
             <tr>
               <td><A href="/cgi-bin/mo/stamm_abholstellen.cgi?port=$port&session=$session">Abholstellen-Verwaltung</A>
               <td><A href="/cgi-bin/mo/stamm_kategorie.cgi?port=$port&session=$session">Kategien-Verwaltung</A>
               <td>
               <td><A href="/cgi-bin/mo/stamm_taetigkeit.cgi?port=
          .....
          <td>
          </table>
          KOPF
          } #end sub print_html
          ---------snap------------

          Gruß Jörg

          1. Ich verwende Perl 5.005_02 auf SuSE 6.0 und da läuft folgendes wie Sau:

            ----------snip---------------

            ....

            print <<KOPF;

            ....

            Ach so ist das... ich mache bei Operatoren meistens Leerzeichen dazwischen, wenn der Platz reicht...
            print << KOPF; geht nicht (da wird offensichtlich das Leerzeichen mitgezählt), während print << "KOPF"; keine Probleme macht.

            Ciao,
            Mirko

  2. Vorgehen:
    Vor jede Zeile HTML-code und am Ende der Zeile
    print "... bzw ...\n"; setzen.
    Allen Gänsefüsschen \ voransetzen (und was noch?)
    Ich habe das mehrmals mühsam von Hand gemacht, hat jemand einen Tipp, wie man das ein wenig "automatisieren" könnte??

    Was soll das dann bringen?

    Wenn Du einen statischen Datei-Inhalt ausgeben willst, kannst Du einfach die Datei hochladen, mit open () öffnen und ihren Inhalt ausgeben.
    Aber der Sinn der Sache ist doch normalerweise, daß der Inhalt *dynamisch* berechnet wird, d. h. durch entsprechende Algorithmen in Abhängigkeit von entsprechenden Daten.

    Was man natürlich tun sollte, ist, Standardroutinen aufzubauen.
    Ich habe beispielsweise für die <head>-Section eine Perl-Prozedur mit mehreren Parametern (Titeltext, reload-Frequenz etc.) - der größte Teil der HEAD-Section wird innerhalb eines Projekts einheitlich aussehen. Für das Dokumentende habe ich auch eine solche Funktion; für einige andere Standardaufgaben (etwa in bestimmten Strings Leerzeichen durch   zu ersetzen und Ähnliches) ebenfalls. Diesen Modul binde ich mit "use $local/html;" in jedes CGI-Skript ein.

    Wahrscheinlich gibt es große Teile dieser Funktionen auch in Perl-Standard-Modulen - aber ich bin meine eigenen Routinen gewöhnt und weiß, wovon ich mich abhängig mache.