Matti Maekitalo: Mehrere Seiten in einer Datei

Beitrag lesen

use Mosche;

Daher meine Frage: Wie kann ich eine CGI-Datei so erstellen, dass durch den Beispielsparameter ?view=1 z.B. mein Text über Basteln erscheint und das durch ?view=2 mein Text übers Web erscheint u.s.w.?

Ich habe die Frage so verstanden, dass die HTML-Seiten bereits fertig sind, und nun, je nach Parameter, ausgeliefert werden sollen. Also wohl SSI mit Perl, das wär's doch. Kannst Du uns das bitte auch nochmal zeigen?

Das ist nicht ganz so einfach. Da wären mehrere Möglichkeiten.

a) eine SSI-Seite, die ungefähr so aufgebaut ist:

index.shtml

<Doctype ...>
<html>
<head>
 ...
</head>
<body>
<!--#include file="$QUERY_STRING" -->
</body>
</html>
#######################

aufgerufen wird das ganze so:

index.shtml?seite_die_angezeigt_werden_soll.txt
(kann auch .html sein oder so).

Wichtig bei diesem Beispiel wäre es, dass der Dateikopf (und Menu, ...) alles global definiert wird. Was auch nicht geht, ist das ganze über einen "benannten" Parameter zu erledigen:

index.shtml?file=seite_die_angezeigt_werden_soll.txt # geht mit diesem beispiel _nicht_

b) Zweite Variante wäre über ein CGI-Script:

#!/usr/bin/perl -w

use strict;
use CGI qw(:standard);

hier würde auch

use CGI qw(header param);

reichen, da ich nur diese beiden Funktionen benutze (s.u.)

qw(wort1 wort2 ...) ist übrigens eine Abkürzung für

('wort1', 'wort2', '...');

qw steht für 'quoted words'

print header();

Dateikopf und ähnliches ausgeben

print "<Doctype ...";

if (param('file') && -f param('file')) {
   # wenn der Parameter 'file' und die durch
   # den Parameter benannte Datei existiert,
   # Datei einlesen und anzeigen

my $file = param('file');

# jetzt ggf. in das richtige Verzeichnsi wechseln
   # bei CGI-Programmen kann das aktuelle Verzeichnis
   # undefiniert sein (manchmal)
   chdir('/path/to/your/htdocs/dir');

# datei öffnen
   open(FH, "<$file") or die "Kann $file nicht öffnen: $!";
   # Datei komplett ausgeben
   print <FH>;
   # datei schliessen
   close(FH);
} else {
   print "<h1>Keine Datei verfügbar</h1>";
}

Dateifuß ausgeben

print "</body></html>";

Das kann jetzt so aufgerufen werden:

mein_perl_script.pl?file=/index.html

Diese Variante ist etwas aufwändiger, allerdings im Endeffekt wesentlich flexibler, da Daten im Kopf- und Fußbereich der Seite generiert werden können (SSI enthält ja keine Programmiersprache, deshalb ist das bei der ersten Variante ungleich schwieriger).

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

Und noch zwei drei Bitten. Mach doch wirklich "Mattis Perlkurs" auf. Ich werde ihn aufmerksam verfolgen.

Naja, ich werde gerne die Fragen zu Perl beantworten, die ich beantworten kann. Für einen Perlkurs kann ich allerdings nicht genug Perl - da gibt es bessere Cracks als mich (Frank, n.d., ...).

#/usr/bin/perl -w
Was macht diese Zeile?

Es ist die sogenannte Shebang-Zeile, die den Pfad zum Perl-Interpreter enthält. Wenn da zum Beispiel
#!/bin/sh
steht, kann ich ein Shell-Script schreiben (Shell ist die "Kommandoumgebung" bei *ix Systemen (zB Linux)).

use strict;
Was heißt das?

Standardmäßg läßt Perl immer recht viel durchgehen, zB müssen keine Variablen deklariert werden u.ä. Der 'strict' Mode bewirkt strengere Regeln des Perl-Interpreters. Ich habe mir damit einen saubereren STil angewöhnt, bei dem im Allgemeinen weniger Fehler entstehen.

use CGI qw(:standard);
Und jetzt blicke ich gar nicht mehr durch

Perl muss nicht unbedingt als Sprache für CGI-Programme verwendet werden, ursprünglich wurde es für etwas ganz anderes entwickelt. Trotzdem gibt es ein Perl-Modul, mit dem typische Routinen für den Gebrauch in einer CGI-Umgebung bekomme (Ausgabe des Content-Types, Parsen des Query_Strings, ...). Mit qw(:standard) importiere ich die Standard-Routinen. Es gibt aber auch Symbole, mit denen ich zB nur die Routinen für HTML AUsgaben importiere, ... Ohne das importieren des Symbols könnte ich nur im Objektorientierten Modus arbeiten.

print header();
da kann ich mir noch was vorstellen. Ausgabe des HTML-Headers an die Standardausgabe (wieso ist das jetzt der Browser?) Nur wer hat den Header definiert?

Standardmäßig ist der Header 'text/html'. header() ist im Übrigen eine Routine des CGI-Moduls. Streng genommen müsste ich eigentlich
print header(-type => 'text/html');
schreiben, das spare ich mir hier aber.

use Tschoe qw(Matti);