Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7047[/thread]

Dateieintrag bzw Datei lesen

Leser: 2


<< >> 8 Einträge, 1 Seite
Meike
 2005-06-14 12:14
#55462 #55462
User since
2005-06-14
2 Artikel
BenutzerIn
[default_avatar]
Hallo

Ich möchte auf meiner Homepage Leute was eintragen lassen können, was nachher auch wieder auf der HP ausgegeben wird. Quasie wie ein Gästebuch.
Ich schaffe das mit dem: in eine Datei eintragen nicht.
Der Code an dieser Stelle sieht folgendermassen aus:
------------------------------------
...
$Rezeptdatei = "./Rezept.txt";
##funktioniert nicht
##Formulardaten in Datei eintragen
   open(RAUS, ">>$Rezeptdatei");
   print RAUS $rezepttitel;
   print RAUS "\n";
   close(RAUS);
##Ende funktioniert nicht
...
---------------------------------------------------------

Das müsste doch eigentlich funktionieren oder?
Das Problem ist, dass gar nichts in der Datei dann steht.

Gruß, Meike
renee
 2005-06-14 12:48
#55463 #55463
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest auch Fehlerbehandlung machen:
Code: (dl )
1
2
3
4
5
6
7
8
$Rezeptdatei = "./Rezept.txt";
##funktioniert nicht
##Formulardaten in Datei eintragen
open(RAUS, ">>$Rezeptdatei") or die $!;
print RAUS $rezepttitel;
print RAUS "\n";
close(RAUS);
##Ende funktioniert nicht


Ich hoffe, Du benutzt auch CPAN:CGI und strict
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2005-06-14 13:15
#55464 #55464
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
oft hilft es auch die datei mit dem absoluten pfad anzugeben. evtl. wird die datei schon geschrieben, du weisst nur nicht wo.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Gast Gast
 2005-06-14 16:37
#55465 #55465
Oje wieder mal ich.
Ich komme nicht weite, ich habe jetzt das mit dem strict versucht und so.
Ich schicke dir einfach mal die Datei. Wenn du lust und zeit hast,kannst sie ja mal kurz anschauen, wenn nicht, dann werde ich wohl nochmal ein paar Stündchen dran verbraten müssen.
Kennst du ein echt gutes Tutorial, wo auch ein guter Index drin ist?


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
#!/usr/local/bin/perl
print "Content-type: text/html \n\n";

use strict;
use warnings;
use CGI;

# Perl-Skript zu RezepteEinfuegen.html
#Eingaben lesen
my $data="";
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
my $file ="./RETest.html";

##Name-Wert-Paare splitten
my @pairs;
my $name;
my $value;
my $pair;

@pairs = split(/&/, $data);

foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);

#Konvertierung HTML-Code
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;

$value =~ s/<([^>]|\n)*>//g;

$FORM{$name} = $value;

}


my $abfrage;
$abfrage = new CGI;

my $rezepttitel = $abfrage->param(Rezepttitel);

my $Rezeptdatei = "./Rezept.txt";
##funktioniert nicht
##Formulardaten in Datei eintragen
open(RAUS, ">> $Rezeptdatei");
print RAUS $rezepttitel;
print RAUS "\n";
close(RAUS);
##Ende funktioniert nicht


# Antwortseite
print "<html><head><title> Rezeptseite </title></head><body bgcolor=white>\n";
print "<font size= 5 color=#996633><b>super Rezept</b></font>\n";
print "<b>$FORM{'Rezepttitel'}</b><br>\n";
print "</body></html>\n";
exit;
(END)


Crian: Code-Tags\n\n

<!--EDIT|Crian|1118752863-->
renee
 2005-06-14 16:52
#55466 #55466
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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
#!/usr/local/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);

# Perl-Skript zu RezepteEinfuegen.html
#Eingaben lesen
my $data="";
my $file ="./RETest.html";

my $abfrage = new CGI;
print $abfrage->header();
my %FORM = $abfrage->Vars();

my $rezepttitel = $FORM{Rezepttitel};

my $Rezeptdatei = "./Rezept.txt";
##funktioniert nicht
##Formulardaten in Datei eintragen
  open(RAUS, ">> $Rezeptdatei") or die $!;
  print RAUS $rezepttitel;
  print RAUS "\n";
  close(RAUS);
##Ende funktioniert nicht


# Antwortseite
print "<html><head><title> Rezeptseite </title></head><body bgcolor=white>\n";
print "<font size= 5 color=#996633><b>super Rezept</b></font>\n";
print "<b>",$FORM{'Rezepttitel'},"</b><br>\n";
print "</body></html>\n";
exit;


Kannst Dir ja mal das Wiki anschauen und die pdfs unter http://perlseiten.renee-baecker.de\n\n

<!--EDIT|renee|1118753720-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
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/
Meike
 2005-06-28 18:57
#55468 #55468
User since
2005-06-14
2 Artikel
BenutzerIn
[default_avatar]
Danke für deine Hilfe

Ich hatte jetzt endlich mal wieder den Mut mich davor zu setzen.
Leider verlässt er mich immer, sobald ich etwas nicht kann, was leider oft vorkommt. Bin irgendwie zu dumm eine Programmiersprache vollständig zu lernen.
Also ich habe es jetzt weitestgehen von dir übernommen. Wie mache ich es denn, wenn ich jetzt noch nach zutaten, name ..... immer eine Leerzeile haben will?
Und verschiedene Farben haben will. Ich habe mal auf der seite von cgi.pm gesehen, aber da gibt es nicht so viel oder war ich da dann wohl doch wo falsches?
Würde mich freuen nochmal etwas Hilfe zu bekommen.
Danke
Strat
 2005-06-28 19:36
#55469 #55469
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
eine programmiersprache vollstaendig zu lernen braucht einfach ein wenig zeit und viel uebung, setze dich da nicht selbst zu sehr unter druck, weil sonst der spass verloren geht. Aus Buechern oder meiner "Einfuehrung in Perl" (auf meiner HP unter Vortraege) kann man zwar eine Menge lernen, aber durch rumspielen mit Perl kann sich das gelernte erst festigen.

du kannst mit perl auch direkt html ausgeben, z.B.
Code: (dl )
1
2
3
4
print "Content-type: text/html\n\n";
print "<html><head><title>Testseite</title></head>\n";
print "<body><h1>Testseite</h1></body>\n";
print "</html>\n";

oder vielleicht etwas besser lesbar
Code: (dl )
1
2
3
4
5
print "Content-type: text/html\n\n";
print qq~<html><head><title>Testseite</title></head>
<body><h1>Testseite</h1></body>
</html>
~;

dies duerfte fuer den anfang vielleicht einfacher sein als die CGI-Methoden zu verwenden
z.B.
Code: (dl )
1
2
print $cgi->h1( {-align => 'center', -color => '#ffdd00' }, "Ueberschrift");
print $cgi->hr();

oder:
Code: (dl )
1
2
print qq~<h1 align="center" color="#ffdd00">Ueberschrift</h1>~;
print "<hr>\n";


fuer kleinere projekte reicht das meiner meinung nach voellig, fuer groessere halte ich weder die CGI-Methoden noch HTML pur via print fuer geeignet, sondern verwende da lieber ein Templating System (z.B. HTML::Template), wo das design (also html und vielleicht javascript) in externen dateien liegt, und da nur bestimmte Variablen von Perl durch die Werte ersetzt werden.

um eine leerzeile einzufuegen kannst du z.B. an der entsprechenden stelle ein
Code: (dl )
1
2
3
print "<br><br>\n";
# oder
print "<p></p>\n";

einfuegen.\n\n

<!--EDIT|Strat|1119973069-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 8 Einträge, 1 Seite



View all threads created 2005-06-14 12:14.