Thorsten Niederkrome: Quelltext in andere Quelltexte einbinden

Beitrag lesen

Hallo Leute,

bin lange nicht hier gewesen. Schön, dass es das Forum noch gibt, ich hab nämlich eine kleine Frage :)

Also, ich habe mehrere CGI-Skripte in Perl (unter Linux), bei denen die Initialisierung im grossen und ganzen gleich abläuft. Zum Beispiel enthalten alle Skripte am Anfang die Befehle

use strict;
use CGI qw(:standard);
my $ru = remote_user() || "anonymous";

Weiterhin werden aus einer Datenbank Werte ausgelesen, die z.B. Zugriffsrechte für User steuern, also sowas in der Art wie

my $access_rights = $access_rights{$ru};

Auf die Variablen greifen ich dann in jedem Skript zu. Problem ist, wenn ich jetzt neue Variablen einführe, z.B. einen Konfigurationswert, der von User zu User natürlich unterschiedlich sein kann, dann müsste ich derzeit in jedem Skript diese Intialisierung anpassen - was natürlich viel zu viel Arbeit ist ;)

Darum fängt inzwischen bei mir jedes Skript ungefähr so an:

use strict;
use CGI qw(:standard);
use vars qw($ru $access_rights);
eval cat init.pl;
die $@ if $@;

wobei init.pl dann die Befehle

$ru = remote_user() || "anonymous";
$access_rights = $access_rights{$ru};

enthält. Wenn ich jetzt eine neue allgemeine Variable einführe, dann muss ich "nur" noch das "use vars qw()" in jedem Skript und init.pl anpassen. Aber auch das ist mir zu viel Arbeit ;D

Ich bin also auf der Suche nach einem Pendant wie "#include <source.c>" in C++, welches IMO durch den C-Präprozessor durch den Inhalt der Datei source.c ersetzt wird. Kann man so etwas in Perl überhaupt machen? Ich möchte also am Schluss etwas haben, dass dieses Skript funktioniert:

#!/usr/bin/perl -w
use strict;
source "init.pl"
print "$ru\n";
print remote_host()."\n";

wenn in init.pl dieses seht:

use CGI qw(:standard);
my $ru = remote_user() || "anonymous";

sprich für den Interpreter soll es dasselbe sein wie

#!/usr/bin/perl -w
use strict;
use CGI qw(:standard);
my $ru = remote_user() || "anonymous";
print "$ru\n";
print remote_host()."\n";

Ich habe schon mit eval, do und require rumgespielt, bin aber nie zu dem Ergebnis gekommen wie ich mir das vorstelle. Vielleicht geht es in Perl ja gar nicht (fehlender Präprozessor?), vielleicht habe ich ja auch nur etwas übersehen.

Für jeden Tipp dankbar,
Thorsten