Perl
Nico
0 Rolf0 Frank Schönmann0 Nico
Ich danke erstmal allen denen, die meine letzte Frage beantwortet haben, aber es gibt trotzdem Fehler.
Ich will mit in einer dat-Datei gespeicherten Userdaten eine Usernmae-Passwort-Abfrage machen.
Mit einem Formular, dass per POST die Daten übermittelt.
Hier der Sourcecode:
#!/../../. #Angabe
read(...)
@... = $...
#usw. das ganze zum Formulardaten einlesen, wie's in selfHTML steht...
open(DAT,"dat.dat");
@dat = <DAT>;
close(DAT);
foreach $einzelteil (@dat)
{
($nick, $pwd) = split(/;/, $einzelteil);
if($Formular[1] eq $nick && $Formular[3] eq $pwd)
{
&OK;
}
else
{
&nix;
}
sub OK
{
print "Content-type: text/html\n\n";
print "<html>\n<head>\n<title>OK</title>\n";
print "</head>\n";
print "<body>\n";
print "OK";
print "\n</body>\n</html>";
}
sub nix
{
print "Content-type: text/html\n\n";
print <<ENDE;
<html>
<head>
<title>nix</title>
</head>
<body>
nix
</body>
</html>
ENDE;
}
Das war der ungefähre Sourcecode.
Aber das Programm gibt im HTML-Teil folgendes aus:
Titel: nix
Im body:
nix
Content-type: text/html
nix
oder das wie oben, aber anstatt dem zweiten nix ein super.
Was ist mein Fehler?
sub OK
{
print "Content-type: text/html\n\n";
print "<html>\n<head>\n<title>OK</title>\n";
print "</head>\n";
print "<body>\n";
print "OK";
print "\n</body>\n</html>";
}
Hallo,
wenn ich Dich richtig verstanden haben sollte, soll die "sub nix" genau Dasselbe machen, wie "sub OK" nur eben statt "OK" ein "nix" ausgeben...nimm doch einfach die "sub OK" und ersetze "OK" durch "nix"....
Anmerkung:
Versuch doch einfach mal zu verstehen, was ein CGI-Script überhaupt macht:
Es soll am Ende HTML Code an den Browser senden. Dazu gibt es in Perl die "print - Funktion".
Und die printed das, was zwischen den Hochkommas steht.
Also nach der Zeile
print "Content-type: text/html\n\n";
kommt im einfachsten Fall wieder die Printfunktion mit einem HTML-Grundgerüst zwischen den Hochkommas. Jetzt kannst Du das alles "zeilenweise machen" so wie in "sub OK" das geht auch so.
Denkbar ist es auch, das HTML-Grundgerüst nur einmal "über die Printfunktion zu schicken" und die Subfunktionen haben Rückgabewerte (return ("OK")) oder rufen die Printfunktion etwa so.... print "OK"; print "nix";...
So locker aufgegliedert, kannst Du die Subfunktionen allesamt nacheinander "am Ende" des Scripts definieren einfach der besseren Übersicht wegen.
In SELFHTML steht eine ganze Menge über Perl, eine weiterführende deutsche Perl Dokumentation findest Du hier (auch download ist möglich bzw. empfohlen!):
http://www.phy.uni-bayreuth.de/~btpa25/perl/perl_inhalt.html
Viele Grüße und viel Spaß beim Scripte Schreiben
Rolf
PS: Ein Perlscript kann man schreiben wie man will, es wird immer wie ein Verkehrsunfall aussehen ;-)
hi!
Ich danke erstmal allen denen, die meine letzte Frage beantwortet haben, aber es gibt trotzdem Fehler.
Was denn für Fehler? Was meldet dein Perl-Interpreter bzw. der Server?
foreach $einzelteil (@dat)
{
($nick, $pwd) = split(/;/, $einzelteil);
if($Formular[1] eq $nick && $Formular[3] eq $pwd)
{
&OK;
}
else
{
&nix;
}
}
Hier fehlt das abschließende } der foreach-Schleife.
sub OK
{
print "Content-type: text/html\n\n";
print "<html>\n<head>\n<title>OK</title>\n";
print "<html>\n<head>\n<title>OK</title>\n";
print "</head>\n";
print "</head>\n";
print "<body>\n";
print "OK";
print "\n</body>\n</html>";
print "\n</body>\n</html>";
}
sub nix
{
print "Content-type: text/html\n\n";
print <<ENDE;
print <<'ENDE';
<html>
<head>
<title>nix</title>
</head>
<body>
nix
</body>
</html>
ENDE;
ENDE
Ohne abschließenden Strichpunkt!
}
Das war der ungefähre Sourcecode.
Aber das Programm gibt im HTML-Teil folgendes aus:
[...]
Was ist mein Fehler?
Du überprüfst für jede Zeile aus der Datei, ob die Eingabe stimmt. Jedesmal, wenn sie nicht stimmt, rufst du wieder die Funktion "nix" auf und gibst alles erneut aus.
Probier mal ungefähr folgendes statt deiner foreach-Schleife:
for (@dat)
{
($nick, $pwd) = split(/;/, $_);
if ($Formular[1] eq $nick && $Formular[3] eq $pwd)
{
$ok = 1;
}
}
if ($ok) { &ok; } else { &nix; }
bye, Frank!
hi!
Hi und erstmal danke für deine Antwort!
Du überprüfst für jede Zeile aus der Datei, ob die Eingabe stimmt. Jedesmal, wenn sie nicht stimmt, rufst du wieder die Funktion "nix" auf und gibst alles erneut aus.
Probier mal ungefähr folgendes statt deiner foreach-Schleife:for (@dat)
{
($nick, $pwd) = split(/;/, $_);
if ($Formular[1] eq $nick && $Formular[3] eq $pwd)
{
$ok = 1;
}
}if ($ok) { &ok; } else { &nix; }
bye, Frank!
Hey, du hast ja richtig Ahnung und besser sieht das auch aus, was du mir als Beispiel bietest.
Aber ich habe ein weiteres Problem: Ich habe das ganze jetzt mal auf DOS-Ebene programmiert und mit <STDIN>'s gearbeitet anstatt mit CGI. Beim Datenbank öffnen habe ich wie gute Sitte ist, einen die ("Text"); Gemacht; also open(DAT,"dat.dat") || die ("Text");
Allerdings liefert mir das Programm die "die"-Bedingung zurück, also kann es die Datei nicht finden. Aber sie liegt im gleichen Verzeichnis. Soll ich sie mit ganzem Pfad angeben? Aber das würde im CGI-Einsatz ja wieder Probleme geben. Weißt du einen Rat?
Gruß, Nico!