Script wird nicht ausgeführt!!!
Martin Fink
- perl
Hallo zusammen,
Ich beginne gerade erst mit der PERL Programmierung und hoffe das mein Fehler nicht zu dummer herkunft ist.
FORMULAR:
Ich habe ein Formular mit einer einzelnen Zeile und einem Submit Button.
PERL Variante1:
in meinem programm möchte ich nun die Daten einlesen und in eine Variable schreiben mit:
$daten = <STDIN>
und anschliessend in einer neuen Seite ausgeben:
htmltags mit PRINT befehl.
der tag zur Datenausgabe:
print "$daten\n"
wenn ich das Programm aufrufe passiert am Browser gar nix!!!
Inerpreter läuft aber da ich ein 2Programm geschrieben hab das einen h1 tag ausgibt keine Probleme.
PERL Variante2:
in Selfhtml hab ich eine weitere Variante gefunden.:
read (STDIN, $daten, $env{CONTENT_LENGTH});
die Ausgabe auf der neuen htmlseite ist auch mit:
print "$daten\n"
in diesem Fall wird das Programm auch ausgeführt aber statt dem Inhalt (der zwischen 2 hr tags steht) kommen nur die hori. ruler aber dazwischen stehen nicht die Daten.
Frage:
Warum wird bei der ersten Variante der Code anscheinend gar nicht Kompiliert?
Wieso werden in meiner neuen html-Seite die Daten nicht dargestellt (Variante 2)?
DANKE im voraus für eure Hilfe.
Hi,
Ich beginne gerade erst mit der PERL Programmierung und hoffe das mein Fehler nicht zu dummer herkunft ist.
[...]
Warum wird bei der ersten Variante der Code anscheinend gar nicht Kompiliert?
weil Perl nicht kompiliert, sondern interpretiert wird ;-)
Ernsthaft: Ich werde aus Deinen Erläuterungen leider nicht wirklich schlau, deswegen kann ich Dir nicht sagen, wo der Fehler liegt. Ich kann Dir aber sagen, wie Du ihn vermeiden kannst:
#!/usr/bin/perl -w
use strict;
use CGI ':standard'; # diese Zeile isses
print header, start_html('Testing :-)'), h1(param('xyz')), end_html;
Benutze das CGI-Modul, und solche Probleme existieren nicht mehr. Wenn doch, ist entweder Dein HTML-Code oder Deine Server-Konfiguration flashc.
Cheatah
Hallo.
$daten = <STDIN>
Was soll das sein?
Willst du etwa so die CGI-Parameter auslesen?
Funktionieren tuts so (siehe auch selfhtml):
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
@Fields = split(/&/, $Daten);
foreach $item (@Fields) {
($name, $value) = split(/=/, $item);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
$FormData{$name} = $value;
(hier gehe ich von post aus)
Das geht aber viel besser mit der parameter Methode von
CGI.pm von L.D.Stein (siehe CPAN)
adios
tom
Hi,
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
@Fields = split(/&/, $Daten);
foreach $item (@Fields) {
($name, $value) = split(/=/, $item);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
$FormData{$name} = $value;
(hier gehe ich von post aus)
Das geht aber viel besser mit der parameter Methode von
CGI.pm von L.D.Stein (siehe CPAN)
oh, wirklich? Was ist denn mit
Würdest Du CGI.pm benutzen, hättest Du damit keine Probleme. Obiger Code versagt hingegen.
Cheatah
Würdest Du CGI.pm benutzen, hättest Du damit keine Probleme. Obiger Code versagt hingegen.
Ich bin doch nicht blöd ;-)
Natürlcih nutz ich das CGI.pm.
Meinen obigen Code habe ich noch in alten Backup
Files rausgezogen, der funktioniert auch prima.
Es fehlt halt nur noch der get-Teil.
adios
tom
Hi,
Ich bin doch nicht blöd ;-)
Natürlcih nutz ich das CGI.pm.
brav ;-)
Meinen obigen Code habe ich noch in alten Backup
Files rausgezogen, der funktioniert auch prima.
Es fehlt halt nur noch der get-Teil.
Der steht - zu meinem Bedauern - in SelfHTML. Trotzdem kommt das ganze mit <select multiple> nicht klar. Zwar hat die Version in SelfHTML da AFAIK einen Workaround, aber der ist extrem suboptimal, da er mit Trennern arbeitet, die (egal, welcher Trenner verwendet wird) in den Parameterwerten auch auftauchen können.
Mit CGI::param ist das hingegen kein Problem. Bei mehreren Werten bekommt man halt ein Array zurück, ganz einfach ;-)
Cheatah
Hallo Martin,
Mist, jetzt war Cheatah wieder schneller ;-)
Dann änder ich mal das bereits geschriebene, und versuch mal ein paar Erklärungsversuche (*schlechtdeutschschreib*), damit man auch was lernt :-)
[...]
PERL Variante1:
$daten = <STDIN>
wenn ich das Programm aufrufe passiert am Browser gar nix!!!
[...]
Da passiert nix, weil der Perl-Interpreter auf eine Eingabe von der Kommadozeile (<STDIN>) wartet. Wenn da nix eingegeben wird, wartet das Skript bis ulitmo, bzw. bis zu einem evtl. Timeout.
PERL Variante2:
in Selfhtml hab ich eine weitere Variante gefunden.:
read (STDIN, $daten, $env{CONTENT_LENGTH});
[...]
in diesem Fall wird das Programm auch ausgeführt aber statt dem Inhalt (der zwischen 2 hr tags steht) kommen nur die hori. ruler aber dazwischen stehen nicht die Daten.
Perl ist Casesensitive, d.h. Groß-Kleinschreibung muss beachtet werden! Es muss deshalb bei Umgebungsvariablen $ENV{} lauten. Außerdem wird ein String als Key erwartet, also muß es insgesamt so aussehen: %ENV{'CONTENT_LENGTH'}.
Frage:
Warum wird bei der ersten Variante der Code anscheinend gar nicht Kompiliert?
Das Skript wird schon ausgeführt, bleibt aber 'hängen', da es auf eine Eingabe wartet.
Wieso werden in meiner neuen html-Seite die Daten nicht dargestellt (Variante 2)?
Weil keine eingelesen werden :-), da die Umgebungsvariable falsch angesprochen wird (liest 0 Bytes von STDIN)
Ich hoffe, das beantwortet Deine Fragen.
Gruß AlexBausW
THX mein problem hat sich gelöst (dank euch)!!! :-)
wie gesagt bin beginner und ‚versuche die sprache von grund auf zu verstehen, ich bin mir bewusst das es jede menge module und bibliotheken gibt die mir helfen meine arbeit effektiver zu machen.
ich hab auch noch gar keine ahnung wie ich diese module und bibliotheken nutze (leider manchmal) aber ich versuche die sprache trotzdem in ihren grundzügen zu erlernen.
danke euch allen für die hilfestellung
cu martin