Quelltext in andere Quelltexte einbinden
Thorsten Niederkrome
- perl
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
Sup!
Vielleicht schreibst Du ein eigenes Modul, und used das dann?
Das Modul kann dann auch seine eigenen Variablen exportieren und alles wird gut.
Gruesse,
Bio
use Mosche;
Vielleicht schreibst Du ein eigenes Modul, und used das dann?
Das Modul kann dann auch seine eigenen Variablen exportieren und alles wird gut.
Und hier als Stichwort
perldoc Exporter
Dort ist alles nochmal kurz erklärt - für Grundlagen dürfte ein Blick in
perldoc perlmod
auch hilfreich sein :-)
use Tschoe qw(Matti);
Hallo,
Vielleicht schreibst Du ein eigenes Modul, und used das dann?
Das Modul kann dann auch seine eigenen Variablen exportieren und alles wird gut.
Hmm, na gut, das alles in ein Modul reinpacken ist zwar jetzt weitaus mehr Arbeit als wenn es doch so etwas wie "#include <init.pl>" gäbe, aber ich schätze auf die Dauer rechnet sich der Aufwand doch, darum hab ich damit begonnen. [Wehe, es kommt jetzt einer, der mir doch den #inlcude-Befehl bei Perl zeigt ;)]
Ein Frage zu Modulen:
Kann das Modul überprüfen, welche Importsymbole vom Modul angefordert wurden? Soll heissen, wenn ich folgendes schreibe:
Im Modul:
@EXPORT_OK = qw(BEGIN_HTML END_HTML);
%EXPORT_TAGS = (
CGI => [ qw(BEGIN_HTML END_HTML) ]
);
und im Hauptskript:
use MeinModul qw(:DEFAULT :CGI);
Kann ich dann im Modul feststellen, dass die Gruppe CGI angefordert wurde, um dann z.B. besondere exportierte CGI-Variablen mit sinnvollen Werten zu belegen?
Gruß
Thorsten
use Mosche;
Ein Frage zu Modulen:
Kann das Modul überprüfen, welche Importsymbole vom Modul angefordert wurden?
Kann ich dann im Modul feststellen, dass die Gruppe CGI angefordert wurde, um dann z.B. besondere exportierte CGI-Variablen mit sinnvollen Werten zu belegen?
Nein, das ist IMHO nicht möglich.
use Tschoe qw(Matti);
Hallo,
Kann ich dann im Modul feststellen, dass die Gruppe CGI angefordert wurde, um dann z.B. besondere exportierte CGI-Variablen mit sinnvollen Werten zu belegen?
Nein, das ist IMHO nicht möglich.
Na ja, ganz so pessimistishc würde ich es nicht sehen. Es wäre durchaus möglich (und wird auch gemacht), im Modul die Standardimplementation von import aus dem Exporter-Modul zu überladen, bzw. zu erweitern.
Damit könnte man sehr wohl im Modul ermitteln, welche Export-Liste angefordert wurde.
Näheres dazu in:
perldoc perlmod
perldoc perlmodlib
perldoc Exporter
Grüße
Klaus