Stephan Brun: Problem mit Script

Hallo

Ich bin ein ziemlicher CGI-Anfänger, habe mich aber nun doch mal was an das Thema herangewagt. Leider mit nur mässigem Erfolg. Mein Script zur Datenaufbereitung will einfach nicht funktionieren, obwohl ich nun alles viele Male genau durchgegangen bin, ohne einen Fehler zu finden.
Das Script wird zwar anscheinend eingelesen, es dauert dann aber lange (1bis 2 Minuten), bis ich die Meldung "Keine Daten gefunden" erhalte.
Andere Scripts, welche ich erstellt habe, laufen problemlos, am Webserver oder Perlinterpreter kann es also nicht liegen, der Fehler muss im Script sein.

Kann mir jemand weiterhelfen?

Viele Dank
Stephan

Hier nun das Script:

#!c:\perl\bin\perl.exe

$daten = <STDIN>;
%daten = &CGIDatenaufbereiter ($daten);
print "Content-type: text/html\n\n";
print '<html>';
print '<head>';
print '<title>Antwortseite</title>';
print '</head>';
print '<body>';
print '<hr>';
while ( ($temp, $wert = each %daten)
{
  print "$wert";
}

print '<hr>';
print '</body>';
print '</html>';

sub CGIDatenaufbereiter
{
  local ($cgidatenskalar, $name, $daten);
  local @cgidatenliste;
  local %cgidatenhash;
  if ( $_[0] )
  {
    $cgidatenskalar = $_[0];
  }
  else
  {
    print STDERR "Es wurden keine Daten an den CGIDatenaufbereiter übergeben\n";
  }
  @cgidatenliste = split(/[&;]/ , $cgidatenskalar);
  foreach $listeneintrag (@cgidatenliste)
  {
    $listeneintrag =~ s/+/ /go;
    ($name, $daten) = split( /=/ , $listeneintrag );
    $name =~ s/%(..)/pack("c",hex($1))/ge;
    $daten =~ s/%(..)/pack("c",hex($1))/ge;
    $cgidatenhash{$name} = $daten;
  }

return %cgidatenhash;
}

  1. Hallo Stephan,

    Mein Script zur Datenaufbereitung will einfach nicht funktionieren, obwohl ich nun alles viele Male genau durchgegangen bin, ohne einen Fehler zu finden.

    Ein Syntaxfehler ist mir aufgefallen: In der while-Schleife werden 2 Klammern geöffnet, nur eine geschlossen.

    Das Script wird zwar anscheinend eingelesen, es dauert dann aber lange (1bis 2 Minuten), bis ich die Meldung "Keine Daten gefunden" erhalte.

    Es wartet auf eine Eingabe über STDIN. Führe das Script mal unter DOS/Eingabeaufforderung aus und gebe einen Text ein, dann erhältst du auch eine Ausgabe.

    Schau dir mal <../../tga.htm> und <../../tgcm.htm>] an.
    Dort wird beschrieben, wie du Daten auslesen bzw. übergeben kannst.

    Johannes

  2. Hallo Stephan,

    Hallo

    Ich bin ein ziemlicher CGI-Anfänger, habe mich aber nun doch mal
    was an das Thema herangewagt. Leider mit nur mässigem Erfolg.

    Du meinst wahrscheinlich Perl.

    Mein Script zur Datenaufbereitung will einfach nicht
    funktionieren, obwohl ich nun alles viele Male genau
    durchgegangen bin, ohne einen Fehler zu finden.

    starte es von der Konsole aus und Du bekommst folgenden Fehler:
    syntax error at C:\test.pl line 13, near ")
    {"
    Execution of C:\test.pl aborted due to compilation errors.
    Aber dazu spaeter mehr.

    Das Script wird zwar anscheinend eingelesen, es dauert dann aber
    lange (1bis 2 Minuten), bis ich die Meldung "Keine Daten
    gefunden" erhalte.

    Eigentlich sollte es gar nicht laufen. Vielleicht doch nur ein Cut'n Paste Fehler

    Andere Scripts, welche ich erstellt habe, laufen problemlos, am
    Webserver oder Perlinterpreter kann es also nicht liegen, der
    Fehler muss im Script sein.

    Hmm, wie sieht denn Deine Form aus mit dem Du das Skript startest ?
    Wichtig ist hier, dass Du method=post benutzt.

    Kann mir jemand weiterhelfen?

    Ok, lass mal sehen...

    Hier nun das Script:

    #!c:\perl\bin\perl.exe

    #!perl -w
    Damit erhaelst Du informative Meldungen, die Dir beim Debuggen helfen
    use strict;  
    Einschraenkendes Pragma um Fehler zu vermeiden,
    perldoc strict
    Wenn Du das benutzt und Du solltest, muss jede Variable mit my
    deklariert oder mit Package::Var zugegriffen werden.

    $daten = <STDIN>;
    %daten = &CGIDatenaufbereiter ($daten);
    print "Content-type: text/html\n\n";
    print '<html>';
    print '<head>';
    print '<title>Antwortseite</title>';
    print '</head>';
    print '<body>';
    print '<hr>';
    while ( ($temp, $wert = each %daten)

    Hier ist ein Syntaxfehler. Dies muss
    while ( ($temp, $wert *)* = each %daten)
    Natuerlich ohne die *

    {
      print "$wert";
    }
    print '<hr>';
    print '</body>';
    print '</html>';

    sub CGIDatenaufbereiter
    {
      local ($cgidatenskalar, $name, $daten);
      local @cgidatenliste;
      local %cgidatenhash;

    Hier solltest Du "my" nehmen
    perldoc -f my
    perldoc -f local

    if ( $_[0] )
      {
        $cgidatenskalar = $_[0];
      }
      else
      {
        print STDERR "Es wurden keine Daten an den

    »»     CGIDatenaufbereiter übergeben\n";

    }
      @cgidatenliste = split(/[&;]/ , $cgidatenskalar);
      foreach $listeneintrag (@cgidatenliste)
      {
        $listeneintrag =~ s/+/ /go;

    Das /o ist hier voellig unnoetig.
    perldoc perlop

    ($name, $daten) = split( /=/ , $listeneintrag );
        $name =~ s/%(..)/pack("c",hex($1))/ge;
        $daten =~ s/%(..)/pack("c",hex($1))/ge;
        $cgidatenhash{$name} = $daten;
        }

    return %cgidatenhash;
    }

    So jetzt sollte es funktionieren, ich wuerde jedoch vorschlagen,
    das Ganze folgendermassen zu machen:

    #!/usr/bin/perl -w
    use strict;
    use CGI qw/:standard/;

    print header,
          hr,
          print map ($_ param($_))),param()));

    Schau Dir mal
    perldoc CGI
    an

    Viele Dank
    Stephan

    Gruss
       Kai

  3. Kann mir jemand weiterhelfen?

    use CGI;

    Peter