STDIN einlesen, leere Variable
wusel101
- perl
Hallo!
Habe die Lösung für das im Archiv z.B. unter:
http://forum.de.selfhtml.org/archiv/2001/5/t24555/
beschriebene Problem (leere Variable: STDIN lässt sich nicht
einlesen) per Zufall mit "try + error" gefunden:
Habe (wie viele) zum Auffinden von Fehlern am Anfang der Perlscripts:
#!/usr/bin/perl --
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI qw(:standard); print header();
warningsToBrowser(1);
Soweit so gut. Später werden dann Formulardaten eingelesen mit:
if($ENV{'REQUEST_METHOD'} eq 'GET') { $Daten = $ENV{'QUERY_STRING'} }
else { binmode STDIN;
read STDIN, $Daten, $ENV{'CONTENT_LENGTH'}; } ;
Dann war aber jedesmal unerklärlicherweise $Daten LEER.
ABER:
sobald ich die Zeilen am Anfang wegmache, insbesondere die Zeile:
use CGI qw(:standard); print header();
funktioniert es wieder _tadellos_ !!!
D.h. (...eigentlich unerklärlicherweise) führt die "Fehleranzeigeroutine" zu einem scheinbar leeren STDIN.
(Nur "scheinbar", denn $ENV{'CONTENT_LENGTH'} ergab auch hier _immer_ einen Wert grösser Null, selbst wenn $Daten einfach nur leer blieb, was ja ein Widerspruch in sich ist und nicht sein konnte. )
Gruss,
Chris
www.salsa.at
Hi,
Habe die Lösung für das im Archiv z.B. unter:
http://forum.de.selfhtml.org/archiv/2001/5/t24555/
ui.
sobald ich die Zeilen am Anfang wegmache, insbesondere die Zeile:
use CGI qw(:standard); print header();
funktioniert es wieder _tadellos_ !!!
Ei.
D.h. (...eigentlich unerklärlicherweise) führt die "Fehleranzeigeroutine" zu einem scheinbar leeren STDIN.
Absolut nicht unerklärlicherweise. In STDIN liegen die POST-Daten, die vom CGI-Modul initial eingelesen werden, was die Standard-Eingabe leert.
(Nur "scheinbar", denn $ENV{'CONTENT_LENGTH'} ergab auch hier _immer_ einen Wert grösser Null, selbst wenn $Daten einfach nur leer blieb, was ja ein Widerspruch in sich ist und nicht sein konnte. )
Der HTTP-Header Content-Length sagt auch dann noch, wie viele Daten übertragen wurden, wenn diese bereits gelesen worden sind. Aus welchem Grund sollte man eigentlich die POST-Daten selbst analysieren wollen? Das CGI-Modul meistert diese Aufgabe hervorragend.
Cheatah
Moin,
mit PERL STDIN einlesen? Das geht so:
my $in = <STDIN>; # Script wartet auf Eingabe....
print chomp($in), "\n"; # gibt das oder die eingegebenen Zeichen aus, nachdem [Enter] gedrückt wurde.
Du siehst also, mit einem einfachen print-Befehl, was an STDIN eingegeben wurde.
--roro
Du siehst also, mit einem einfachen print-Befehl, was an STDIN eingegeben wurde.
Ähm, es ging doch um CGI, oder?
Siechfred
Hallo,
ABER:
sobald ich die Zeilen am Anfang wegmache, insbesondere die Zeile:use CGI qw(:standard); print header();
funktioniert es wieder _tadellos_ !!!
Wenn du einen Header _vor_ der Datenaufbereitung ausgibst, wird alles nach diesem Befehl als text/html, bzw text/plain interpretiert.
Markus
#!/usr/bin/perl --
use CGI;
Du bindest hier das Modul ein...
if($ENV{'REQUEST_METHOD'} eq 'GET') { $Daten = $ENV{'QUERY_STRING'} }
else { binmode STDIN;bzw.: Einlesen im POST-mode, $Daten bis Länge des Strings:
read STDIN, $Daten, $ENV{'CONTENT_LENGTH'}; } ;
Warum nutzt du es nicht?
Struppi.