Christoph Schnauß: Funktionsaufrufe in HERE-Dokumenten...?

Beitrag lesen

hallo,

OK, also folgendes Beispiel:

use strict;
my $zahl=5;

require "rechnung.cgi";

print "Sie müssten nun SECHS sehen.";

RECHNUNG.CGI:

use strict;
$zahl++;
print $zahl;
Das geht nicht.

Nein, kann es auch nicht. Mal abgesehen davon, daß dein Beispielcode - naja, sagen wir mal, er sei unvollständig. Allerdings wird damit ungefähr deutlich, was du machen möchtest. Und das macht die Beantwortung keineswegs leichter.

Das Ganze hat mit dem Konzept der Namensräume zu tun und mit dem grundlegenden Programmablauf. Dein "Hauptscript" eröffnet einen solchen Namensraum ("main"), in dem dann auch die vom Hauptscript verwendeten Variablen gehalten werden. An der Stelle, an der du "require" notierst, wird aber dieser Namensraum verlassen, da ja jetzt ein völlig neues Script abgearbeitet wird. Das hat (meist) einen anderen Namensraum und bekommt so gut wie gar nichts "übergeben". Es ist ein eigenständiges Programm, was abgearbeitet wird, und sobald alles erledigt ist, kehrt der Perl-Interpreter wieder zum Hauptscript zurück, also auch an die Stelle, an der ihm der vom Hauptscript eröffnete Namensraum zur Verfügung steht. Damit gilt auch keine Variable mehr, die in dem eingebundenen Script eventuell mit Werten befüllt wurde.
Es gibt ein paar Tricks, mit denen man das in deinem Sinn nutzen kann.

Um im REQUIRE-Skript (das REQUIRE steht i. d. R. *NACH* der Variablen-deklaration) mit der Varaible rechnen zu können, müss ich in beiden Skripten "our $zahl;" schreiben.

Zwar ist our eine kluge Wahl (gegenüber dem veraltenden Pragma "vars"). behebt aber dein Problem nicht.

Ich verfechte ganz gern die Ansicht, daß man anstelle von "require" heute lieber use einsetzen sollte. Damit stehst du allerdings vor dem Problem, daß ein "use rechnung.cgi" nicht funktionieren wird, weil "use" ein Modul einbinden möchte - also eventuell "rechnung.pm". Aber schließlich sollte es kein Problem sein, bei Bedarf ein eigenes Modul zu schreiben.

Der Vorteil für deinen Programmablauf besteht darin, daß Module sofort kompiliert werden und alles, was in ihnen definiert ist, für den Rest der Script-Laufzeit zur Verfügung steht. Wenn du für eine Perl-Applikation also eine Menge Variablen brauchst, ist es sinnvoll, die in einem Modul zu definieren. Wird das dann mit "use" ins Hauptscript übernommen, stehen sie zur Verfügung, und du ersparst dir weitere Deklarationen.

Die ganze Geschichte ist weit komplexer und vielschichtiger, da hat sich von Perl 5.6 zu Perl 5.8.8 (das ist die aktuelle Version) auch einiges verändert (worauf die aktuelle online-Version von SELFHTML übrigens noch nicht eingehen konnte und auch die nächste wird es vermutlich noch nicht in befriedigendem Maß tun), so daß man bei scheinbar unlösbaren Problemen auch noch schauen muß, welche Version des Perl-Interpreters zur Verfügung steht. Man kann allenfalls empfehlen, für ein mit "require" eingebundenes Script nur sehr einfache Aufgaben (beispielsweise die Abarbeitung von HERE-Dokumenten) ohne allzuviele Variablen vorzusehen oder besser noch ganz darauf zu verzichten und die gewünschte Perl-Applikation gleich aus mehreren eigenen Modulen zusammenzusetzen.

Grüße aus Berlin

Christoph S.

--
Visitenkarte
ss:| zu:) ls:& fo:) va:) sh:| rl:|