Oliver Meisenberg: Aufruf eines zweiten Skripts

Hallo @all!

Ich habe zwei CGI/Perl-Skripten geschrieben. Skript 1 liest Daten aus einer Textdatei und erstellt daraus eine HTML-Datei mit einem Formular (mehrere Text-Eingabefelder). Beim Abschicken der in das Formular eingetragenen Daten wird Skript 2 aufgerufen; dieses fügt die aus dem Formular gelesenen Daten der genannten Textdatei hinzu (im unten zitierten Code nicht enthalten, da wohl nicht relevant) und ruft wieder Skript 1 auf, das dann eine aktualisierte HTML-Datei erzeugen soll.

Dabei folgende Probleme:

Rufe ich Skript 1 direkt auf (c:/serverpfad/cgi-bin/script1.pl), erscheint nach einigen Minuten im Browser eine Fehlermeldung zu einem Internal Server Error und in der Log-Datei des Servers ein "Premature end of script headers: Script2.pl".

Rufe ich aus Skript 2 das Skript 1 über den Server auf (http://127.0.0.1/cgi-bin/script1.pl), erhalte ich einen Internal Server Error mit dem Log, der Befehl "http:" wurde nicht gefunden.

Zur Info:

Mein Server ist Apache 2; er läuft nur lokal (IP-Adresse: 127.0.0.1). Betriebssystem ist Windows XP, Browser IE 6.

Vielen Dank für hilfreiche Vorschläge.

Skript 1:

  
#!"C:\Programme\Perl\bin\perl.exe"  
  
print "Content-type: text/html\n\n";  
  
use strict;  
use CGI;  
my $cgi = new CGI;  
use CGI::Carp qw(fatalsToBrowser);  
  
sub SeiteErzeugen { # erzeugt nur den Body  
  
  open(DATEI, "<c:/Textdatei.txt") || die "Datei nicht gefunden";  
  my @Daten = <DATEI>;  
  close(DATEI);  
  
  my $Nummer = 0;  
  
  print "<form action=\"http://127.0.0.1/cgi-bin/Script2.pl\" method=\"post\">\n";  
  
  foreach(@Daten) {  
    my $Formularcode = "Name: \n<input name=\"Name".$Nummer."\" type=\"text\">\n<input type=\"submit\" value=\"Eintragen\">\n";  
  
    print  
      "<p>  
        $_<br>  
        $Formularcode  
      </p>";  
  
  $Nummer++;  
  }  
  
  print "</form>";  
}  
  
print "Content-type: text/html\n\n";  
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";  
print "<body>";  
SeiteErzeugen();  
print "</body>\n</html>";  

Skript 2:

  
#!"C:\Programme\Perl\bin\perl.exe"  
  
use strict;  
  
exec("c:/serverpfad/cgi-bin/Script1.pl");  
# oder:  
# exec("http://127.0.0.1/cgi-bin/Script1.pl");  

  1. hallo,

    #!"C:\Programme\Perl\bin\perl.exe"

    Da gehts schon los. Backslashes sind hier nicht zulässig. Korrekt wäre
       C:/Programme/Perl/bin/perl.exe

    Skript 2:
    #!"C:\Programme\Perl\bin\perl.exe"

    Dasselbe.

    exec("c:/serverpfad/cgi-bin/Script1.pl");

    Hier ist es richtig.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hallo Christoph,

      danke für den Hinweis. Ausgebessert habe ich den Fehler, laufen tun die Skripten aber noch nicht. (Übrigens wurde auch mit Backslashes der Interpreter gefunden.)

      hallo,

      #!"C:\Programme\Perl\bin\perl.exe"

      Da gehts schon los. Backslashes sind hier nicht zulässig. Korrekt wäre
         C:/Programme/Perl/bin/perl.exe

      Skript 2:
      #!"C:\Programme\Perl\bin\perl.exe"

      Dasselbe.

      exec("c:/serverpfad/cgi-bin/Script1.pl");

      Hier ist es richtig.

      Grüße aus Berlin

      Christoph S.

  2. Ich habe zwei CGI/Perl-Skripten geschrieben. Skript 1 liest Daten aus einer Textdatei und erstellt daraus eine HTML-Datei mit einem Formular (mehrere Text-Eingabefelder). Beim Abschicken der in das Formular eingetragenen Daten wird Skript 2 aufgerufen; dieses fügt die aus dem Formular gelesenen Daten der genannten Textdatei hinzu (im unten zitierten Code nicht enthalten, da wohl nicht relevant) und ruft wieder Skript 1 auf, das dann eine aktualisierte HTML-Datei erzeugen soll.

    Üblicherweise bindet man das zweite Skript mit require oder use ein. exec oder system ist hier nicht sinnvoll.

    also das ganze besser Modular aufbauen und dann die nötigen Module einbinden.

    In etwa so:

    Hauptdatei:

    #!/usr/bin/perl -w  
    use strict;  
    use CGI;  
      
    if( CGI::param('save')  
    {  
    require 'test2.pl';  
    save(); # <- Hier deine Speicherfunktion im Modul test2.pl  
    }  
      
    print CGI::header, CGI::start_html(), SeiteErzeugen()  
    , CGI::end_html();  
      
    sub SeiteErzeugen { # erzeugt nur den Body  
      
      open(DATEI, "c:/Textdatei.txt") || die "Datei nicht gefunden";  
      my @Daten = <DATEI>;  
      close(DATEI);  
      
      my $Nummer = 0;  
      
      print CGI::start_form();  
      
      foreach(@Daten) {  
        print CGI::p( $_ . '<br>'  
        . CGI::textfield( -name => 'Name'. $Nummer)  
        . CGI::submit( -name => 'save', -value => 'Eintragen)  
        );  
      
      $Nummer++;  
      }  
      
      print CGI::end_form();  
    }  
      
    # test2.pl:  
      
    #!/usr/bin/perl -w  
    use strict;  
      
    sub save()  
    {  
    ....  
    }  
    
    

    Struppi.