ich wuerde renee's beispiel noch etwas erweitern:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#! /usr/bin/perl
use warnings;
use strict;
use CGI;
# versucht, nicht nur fehler, sondern auch warnungen
# im browser auszugeben; diese Zeile sollte auskommentiert
# werden, wenn das script zufriedenstellend laeuft, um so
# keinem Hacker mehr Infos zu geben als noetig
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
# bei manchen Webservern ist das aktuelle Verzeichnis nicht
# das, in dem das cgi-Script liegt. $FindBin::Bin enthaelt den
# pfad zum gerade ausgefuehrten Script, und man kann seine
# datei relativ zum cgi-script legen, und ist so portabler als
# mit einem hardgecodeten absolutem pfad
use FindBin;
my $file = "$FindBin::Bin/RETest.html";
# oder: my $file = "$FindBin::Bin/daten/RETest.html";
# neues CGI-Objekt erzeugen
my $cgi = CGI->new();
# liest alle cgi-parameter aus und weist sie %content zu
my %content = $cgi->Vars();
# wenn ein rezept eingegeben wurde, speichere es
if (scalar(keys %content)) {
# datei zum anhaengen oeffnen
unless (open (FILE, ">> $file")) {
die "Error: couldn't open file '$file' for appending: $!\n";
} # unless
# schreibe das neue Rezept in die Datei; wie das geht,
# haengt davon ab, welches Format du waehlst, z.B.
# titel: neues Rezept fuer Pflaumenkuchen
# rezept: Man nehme:<br>Wasser<br>Eier<br>Zucker...
# (leerzeile)
# titel: neues Rezept fuer Apfelkuchen
# rezept: Man nehme:<br>Wasser<br>Eier<br>Zucker...
# muss so heissen wie in der HTML-Form
my $title = $content{Rezepttitel};
my $rezept = $content{Rezept};
# "gefaehrliche" sonderzeichen, die das format
# beeintraechtigen koennen, ersetzen
foreach ($title, $rezept) {
$_ = $cgi->escapeHTML($_); # html-sonderzeichen
s|\r?\n|<br />|g; # zeilenumbrueche zu <br />
}
print FILE "titel: $title\nrezept: $rezept\n\n";
# schliesse datei; falls es fehlschlaegt, fehlermeldung (z.B:
# Festplatte voll)
close(FILE) or die "Error: couldn't close file '$file': $!\n";
} # if
# gebe die HTML-Seite aus
# HTTP-Header ausgeben
print $cgi->header();
# HTML-Header ausgeben; fuer weitere optionen: perldoc CGI
print $cgi->start_html(-title => 'Rezeptseite');
print $cgi->h1("Meike's Rezepte");
# datei zum lesen oeffnen
unless (open (FH, "< $file")) {
die "Error: couldn't open file '$file': $!\n";
} # unless
else {
# lese nicht zeilen-, sondern blockweise
local $/ = "\n\n";
# rueckwaerts lesen, sodass das neueste rezept
# immer oben kommt und das aelteste ganz unten
foreach my $entry (reverse <FH>) {
chomp($entry); # \n\n rauswerfen
# block an zeilenumbruch aufsplitten
my ($titel, $rezept) = split(/\n/, $entry);
# am anfang steht ja noch unnuetz titel: bzw. rezept:
# drinnen; das soll nun fuer die Ausgabe weg
$titel =~ s/^titel://; $rezept =~ s/^rezept://;
# das zeug ausgeben:
print $cgi->h2($titel);
print $cgi->p($rezept);
print $cgi->hr(); # vielleicht eine trennlinie ausgeben
} # foreach
# Datei schliessen
close(FH);
} # else
# HTML beenden
print $cgi->end_html();
nicht getestet, vielleicht laeuft es ja