Thread Dateieintrag bzw Datei lesen (7 answers)
Opened by Meike at 2005-06-14 12:14

Strat
 2005-06-15 17:07
#55467 #55467
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich wuerde renee's beispiel noch etwas erweitern:
Code: (dl )
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
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/

View full thread Dateieintrag bzw Datei lesen