Patrick Andrieu: Premature End of Script header

Beitrag lesen

Hallo Joerg!

Stimmt "header" war verkehrt, mit "-w" kommt ein "print on unopened file handle".

Ja, steckl war etwas minimalistisch und hätte Dir auch sagen sollen, wozu die Option "w" gut ist. Mit dieser Option wird die Ausgabe sogenannter Warnungen eingeschaltet, die sehr nützlich sind, und zwar so, dass sie unverzichtbar sind. Auf "-w" in der Shebang-Zeile kannst Du aber verzichten, wenn Du stattdessen:

use warnings;

angibst.

mit "-w" kommt ein "print on unopened file handle".

War die Ausgabe eher nicht ähnlich dieser:

Unquoted string "header" may clash with future reserved word at - line 3.
Name "main::header" used only once: possible typo at - line 3.
print() on unopened filehandle header at - line 3.

?

Alle diese drei Zeilen geben Dir genug Informationen, um herauszufinden, was da schief geht:

Erste Warnung: unquoted string "header"

bedeutet, Perl versteht Dein »print header;« als der evtl. Versuch, die Zeichenkette header auszugeben, die leider nicht in Anführungszeichen steht, und somit verdächtigt wird, mit evtl. reservierten Perl-eigene Namen in Konflikt zu treten... -> Du wirst gewarnt (darüber informiert)

Zweite Warnung: Name "main::header" used only once: possible typo

bedeutet: Sollte header doch eine Variable oder eine Funktion sein, kommt der Name nur einmal vor, es könnte ein Tippfehler sein -> Du wirst gewarnt (darüber informiert)

Dritte Warnung: print() on unopend filehandle

bedeutet: Perl meint, Du gibst print (das ja eine Perl-eigene _Funktion_ ist, deswegen werden die Klammer mit angegeben) einen FileHandle, evtl. um in eine Datei zu schreiben, die Du vorher aber nirgends (mit diesem Filehandle) nicht geöffnet hast.

Und wie kann man das ganze »zum Laufen« bringen?

1.
use strict;
use warnings;
use CGI qw(header);
print header();
print "Hallo Welt";

oder 2.
use strict;
use warnings;
use CGI;
print CGI::header();
print "Hallo Welt";

oder 3. ohne CGI-Modul, dann wie von buzzer vorgeschlagen:
use strict;
use warnings;
print "Content-type: text/html\n\n";
print "Hallo Welt";

Wobei von den dreien Version 1. vorzuziehen ist. Nur fragst Du Dich, warum funktionieren diese Beispiele und Deins nicht?

Weil header nichts ist, womit Perl was anfangen kann. Wenn Du auf Funktionen des CGI-Moduls zurückgreifen willst, die Dir beispielsweise die Angabe des lästigen Content-type ersparen, oder andere, musst Du diese laden (importieren):

use CGI qw(header); oder use CGI "header"; oder einfacher: use CGI qw(:standard); <- da werden alle Standardfunktionen importiert.

Um den Rückgabewert einer _Funktion_ auszugeben, muss Perl auch wissen, dass Du das tun willst:

print header(); oder print CGI::header();
Die Klammer dürfen hier nicht fehlen!

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
Nichts ist unmöglich? Doch!
Heute schon gegökt?