Bekomme keinen Wert von Perl zurueck

Von: , Frage gestellt am Sa, 23. Jul 2011

Hallo,

ich rufe von einem php-Programm ein Perl-Script auf, das einiges erledigt und dann einen Wert an php zurueckgeben soll.

Bei php sieht es folgendermasssen aus:

$senddata = "https://domain.net/cgi-bin/.......pl?parameter...";
if($fp = @fopen($senddata,"r"))
   {
   while (!feof($fp))
      { $antwort .= fgets($fp,128); }
   fclose($fp);
   }
print "Antwort: $antwort<br>";


Bei Perl ist es etwas komplizierter. Hier nur die relevanten Zeilen.

use strict;
use warnings;

# Kein Cache, direkte Ausgabe von Print
$|=1;
# Umleitung in eine Logdatei
$protdir = '......';
open(LOG1, ">>$protdir");
open(STDOUT, ">>&LOG1");

print LOG1 "Start ...... Logdatei\n";

close(STDOUT);
close(LOG1);
print "Content-type: text/html\n\nOK\n";


Die Eintraege in der Logdatei sind korrekt und komplett.
Ich habe es auch schon bei dem letzten print nur mit
print "OK";
probiert, geht aber auch nicht.

Im php script kommt nie etwas an.
Ist da irgendwo ein Denkfehler drin?

Chris

4 Antworten zu dieser Frage

  1. Antwort von nach 3 Stunden 2 hilfreich
    Re: Bekomme keinen Wert von Perl zurueck

    die fehler liegen in 2 zeilen zeilen vor dem print:

    open(STDOUT, ">>&LOG1");
    [...]
    close(STDOUT);
    [...]
    print "Content-type: text/html\n\nOK\n";
    


    du leitest STDOUT nach LOG1 um, somit geht jedes print dorthin.
    dann schliesst du STDOUT auch noch zusätzlich, so dass das print am ende ins leere geht.

    • Antwort von nach 5 Stunden 0 hilfreich
      Re^2: Bekomme keinen Wert von Perl zurueck

      Hallo Tina, die fehler liegen in 2 zeilen zeilen vor dem print:

      open(STDOUT, ">>&LOG1");
      [...]
      close(STDOUT);
      [...]
      print "Content-type: text/html\n\nOK\n";
      


      du leitest STDOUT nach LOG1 um, somit geht jedes print
      dorthin.
      Ja, aber das ist auch gewollt und funktioniert. Es wird ein Logbuch gefuehrt ueber verschiedene Vorgaenge. dann schliesst du STDOUT auch noch zusätzlich, so dass das
      print am ende ins leere geht.
      Wie bekomme ich das STDOUT denn am Ende dazu, dass es die Werte wieder normal druckt? (also z.B. an das aufrufende Programm sendet)?

      Ich dachte, dass ich es wieder schliesen muss, da ich ja Anfangs auch ein open hatte und dass es dann wieder in den Normalzustand uebergeht.

      Chris

      • Antwort von nach 5 Stunden 1 hilfreich
        Re^3: Bekomme keinen Wert von Perl zurueck

        du musst den STDOUT handle vorher in einem anderen filehandle sichern.
        siehe auch perldoc -f open

        open my $oldout, ">&STDOUT" or die $!;
        [...]
        
        open STDOUT, ">>&LOG1" or die $!;
        [...]
        
        # am ende wieder STDOUT auf den ursprünglichen handle setzen
        open STDOUT, ">&", $oldout or die $!;
        print "...\n";
        


        ausserdem, wie hier gezeigt, bei jedem open eventuelle fehler mittels "or die" abfangen.

        • Antwort von nach 7 Stunden 0 hilfreich
          Re^4: Bekomme keinen Wert von Perl zurueck

          Hallo Tina,

          super, das klappt jetzt einwandfrei.

          Vielen Dank fuer Deine Hilfe!

          In welcher Stadt in Deutschland lebst Du?

          Herzliche Gruesse aus der Dominikanischen Republik (trotz Regen 26 Grad)
          Chris

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!