Perl und CGI


Einleitung

Perl von Lary Wall entwickelt, Version 5.0.

Auch Pathologically Eclectic Rubbish Lister

Verwendung

Perl Dateien haben Endung .pl.

Ausführung mit
perl tuwas.pl

Unter UNIX andere Variante:
#!/usr/bin/perl

# Unix Kommentar,
! der Name eines Kommandointerpreters folgt
/usr/bin/ ist eine Pfadangabe,

Kurzes Beispiel:

Frage nach dem Namen und Ausgabe von "Hallo, ... ! "

      (1)  #!perl
      (2)  print "Wie ist dein Name ? ";
      (3)  $name = <STDIN>;
      (4)  chop($name);
      (5)  print "Hallo, $name !\n";

Sprachkonstrukte

der Kontext in dem ein Literal oder eine Variable verwendet wird, wird durch die verwendeten Operatoren erzwungen.

Beispiel

"33" + "44" ergibt Zahl 77
33 . 44 ergibt Zeichenkette "3344"

Zeichenketten

Variablen

Beispiel: Arrays, Felder

  @fred = (11,22,33);
  @barney = @fred;

auch mit dem qw/.../ Operator

  @fred = qw/11 22 33/;

Beispiel: assoziatives Array

  %fred = (1,22,'h',33,"\t",44);
  %barney = %fred;

auch mit dem => Operator

  %fred = (1 => 22, 'h' => 33, "\t" => 44);

Beispiel: Skalare

  print $fred[2] + $fred{'h'};

ergibt 33+33 = 66

Skalar-Kontext

  print @fred * %fred;

ergibt 3*3 = 9

Kontrollstrukturen

Statements,

z.B. Zuweisungen VAR = EXPR;

Folgen von Statements { ... },

Statements immer mit Semikolon abgeschlossen

Kontrollstatements

Nach der Auswertung der Ausdrücke EXPR bedeuten die leere Zeichenkette "" , "0" und 0 false; alle anderen Werte bedeuten true (z.B. auch "00" ).

Match-Operatoren und Variablen Substitutionen

Objekte

Ein- und Ausgabe

Dateien, Pipes und Filehandles.

Print-Formatierung

Zusammen mit HTML überflüssig.

Perl Funktionen reichen von arithmetischen Funktionen und Funktionen für Zeichenketten bis zu Datenbank, Netzwerk und Interprozesskomunikations Funktionen.


Standard Module

Verwendung / Import von Modulen durch
use MODULE CONFIGLIST;

Module sind meist Objektorientiert implementiert
VAR = MODULE -> new();
VAR -> method(param);


CGI Anwendung

Perl Skript, das mit CGI zusammenarbeitet. Es dekodiert die von GCI empfangenen Variablen und Werte, generiert eine HTML Seite mit diesen Informationen und schickt sie an den Absender zurück.

#!/usr/bin/perl
# test perl program to be used for parsing CGI methods
# send anything to this script either via GET or POST methods

&InsertHeader("CGI generated text");
&Parse;
&InsertTrailer;

# subrountines
sub Parse {
    local(@pairs,$pair,$val,$pos, $i);

    if ($ENV{'REQUEST_METHOD'} eq "GET") {
        $in = $ENV{'QUERY_STRING'};
	print "Submitted via GET<P>\n";
    }
    elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
        read(STDIN, $in, $ENV{'CONTENT_LENGTH'}+1);
	print "Submitted via POST<P>\n";
    }

    $i = 0;
    @pairs = split(/&/, $in);

    foreach $pair (@pairs) {
# do the special character conversion
	$pair =~ tr/+/ /;
	$pair =~ s/%(..)/pack("c",hex($1))/ge;

	$pos = index($pair,"=");
	$name = substr($pair,0,$pos);
	$val = substr($pair,$pos+1);

	$i++;
	$entry{$name} = $val;

	print "$i: entry\{\"$name\"\} = $entry{$name}<BR>\n";
    }

    return 1;
}

sub InsertHeader {
    local ($htmltitle) = @_;
    print "Content-type: text/html\n\n";
    print "<HTML>\n<HEAD>\n<TITLE> "
    print "$htmltitle </TITLE>\n</HEAD>\n";
    print "<BODY>\n";
  
    return 1;
}

sub InsertTrailer {
    print "</BODY>\n</HTML>\n";

    return 1;
}

&InsertHeader; bezeichnet eine Funktion, die einen korrekten HTML Header erzeugt. &InsertTrailer; erzeugt den letzten Teil der HTML Seite. &Parse; zerlegt die CGI-Parameter wie im Abschnitt zu CGI besprochen.

Minimales CGI/Perl

Beispiele mit dem Script ex1.cgi

Zum Ausdrucken der Umgebungsvariablen klicken Sie hier.

Zum Ausdrucken der Umgebungsvariablen mit Querystring klicken Sie hier.

Das nächste Script benutzt ein Formular mit "Radio Buttons".

Mein Name:
Mein Status: Student Mitarbeiter Professor

Ein neues Formular mit "Check Boxen", "PopUp Selektoren" und "Textbereichen".

Mein Name:
Mein Status: Student Mitarbeiter Professor
Meine Hobbies: Fußball Reisen Lesen Computer

Perl mit Dekodierung

Beispiele mit dem Script ex2.cgi

Dieses Script gibt alle "name-value" Paare der QUERY_STRING Variable aus (GET Methode).

Mein Name:
Mein Status: Student Mitarbeiter Professor

Dieses Script gibt alle "name-value" Paare von stdin aus (POST Methode).

Mein Name:
Mein Status: Student Mitarbeiter Professor

Perl mit Mail

Beispiele mit dem Script ex3.cgi (mail)

Dieses Script schickt eine Email an den angegebenen Adressaten.

E-Mail Adresse:

Beispiele mit dem Script ex4.cgi (logfile)

Perl mit Log-Datei

Dieses Script schreibt eine Nachricht in ein Log-File.

Mein Name:
Mein Status: Student Mitarbeiter Professor

CGI.pm Modul

Stellt Hilfsmittel für den Einsatz als CGI Programm zur Verfügung.

Beispiel Gästebuch

In einer Datei werden die Bemerkungen der Gäste zusammen mit ihrem Namen und der Uhrzeit des Eintrags gespeichert.

  1. Speichern des akutellen Eintrags in $inhalt
  2. Einlesen der alten Einträge aus Datei in $inhalt
  3. Abspeichern der Einträge in Datei
  4. Aufbau des Eingabeformulars
  5. Anzeige der bisherigen Einträge

Gästebuch in Aktion.

#!/usr/bin/perl

use strict;
use CGI qw/:standard *table/;
use Fcntl qw/:flock/;

sub fehler {
    my $err = "@_";
    print "\n", h1("Unerwarteter Fehler"), "\n", p($err), "\n", end_html;
}

my(
    $GBuch,   # Name der Gästebuch-Datei
    $MaxGB,   # Maximale Anzahl von Einträgen in GB
    $GBTitel, # Titel des Gästebuchs
    $akt,     # neuer Eintrag
    @inhalt,  # Inhalt des Gästebuchs
    $eintrag  # ein Eintrag im Gästebuch
);

$GBTitel = "Gästebuch von Heinz Kredel";
$GBuch   = "/tmp/gb-kredel ";
$MaxGB   = 10;

print header;
print start_html({-bgcolor=>'white'}, $GBTitel);
print "\n", h1($GBTitel), "\n";
$akt = CGI->new();

if ($akt->param('eingabe')) {
   $akt->param("datum", scalar localtime);
   @inhalt = ($akt);
}

open(GBUCH,"+< $GBuch") || fehler("$GBuch kann nicht geöffnet werden.");
flock(GBUCH, LOCK_EX) || fehler("$GBuch kann nicht exclusiv verwendet werden");
while (!eof(GBUCH) && @inhalt < $MaxGB) {
      $eintrag = CGI->new(\*GBUCH);
      push @inhalt, $eintrag;
}

seek(GBUCH, 0, 0 ) || fehler("$GBuch kann nicht zurückgesetzt werden.");
foreach $eintrag (@inhalt) {
     $eintrag->save(\*GBUCH);
}
truncate(GBUCH, tell(GBUCH));
close(GBUCH);
print "\n", hr, "\n", start_form();
print start_table();
print "<tr><td valign='top'> <br>Nachricht: </td>\n<td valign='top'>",
      $akt->textarea(-NAME => "eingabe",
                     -OVERRIDE => 1,
                     -ROWS => "4",
                     -COLS => "50",
                     -VALUE => "" ), 
      "</td></tr>\n";
print "<tr><td>Name: </td>\n<td>", 
      $akt->textfield(-NAME => "name",
                      -OVERRIDE => 1,
                      -SIZE => "50",
                      -VALUE => $akt->param('name')), 
      "</td></tr>\n";
print "<tr><td>", $akt->reset("Löschen"), "</td>\n<td>",
      $akt->submit("Eintragen"),"</td></tr>\n";
print end_table();
print "\n", end_form(), "\n", hr, "\n";

print h2("Bisherige Einträge"), "\n";
foreach $eintrag (@inhalt) {
     print p($eintrag->param("eingabe")), "\n";
     print p({-ALIGN => "right"}, 
             $eintrag->param("name"),
             " @ ", 
             $eintrag->param("datum"), 
            ), "\n";
}
print hr, "\n", end_html, "\n";

Zusammenfassung und Ausblick


© Universität Mannheim, Rechenzentrum, 1998-2002.

Heinz Kredel
Last modified: Tue Nov 12 10:21:33 CET 2002