Bekomme keinen Wert von Perl zurueck

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
";

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

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.

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

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.

1 Like

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