wusel101: STDIN einlesen, leere Variable

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;

bzw.: Einlesen im POST-mode, $Daten  bis Länge des Strings:

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

  1. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. 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

    1. Du siehst also, mit einem einfachen print-Befehl, was an STDIN eingegeben wurde.

      Ähm, es ging doch um CGI, oder?

      Siechfred

      --
      Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
  3. 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

  4. #!/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.

    --
    Javascript ist toll (Perl auch!)