Michael Schröpl: require in required-Modul: Wo bin "ich"?

Beitrag lesen

Hallo,

auf die Gefahr hin, daß das Problem zu speziell ist, stelle ich mal eine Detailfrage über Modulreferenzen. Es geht hauptsächlich um Ästhetik - mit fest eingebrannten Pfadnamen wäre mein Problem zweifellos sofort lösbar.
Kontext ist ActivePerl 5.009, ich hätte also so ziemlich alles zur Verfügung, weiß bloß nicht, wo ich suchen soll.

Ich habe ein System von Perl-Skripts geschrieben. Jeweils ein Bündel zusammengehöriger Skripte (Hauptprogramm plus eingebundene Module) residiert in einem Verzeichnis derselben Ebene; eines dieser Verzeichnisse namens "shared" enthält nur Module, die von vielen bzw. allen anderen Skripten (bzw. jeweils deren Hauptprogrammen required werden.

Um diese Skripte zu finden, verwende ich in den Hauptprogrammen folgende Logik:

use FindBin;
  my $local = $FindBin::Bin;
  my $shared = "$local\..\shared";
  require ("$shared\environment.pl");    # Umgebungsvariablen (Pfade etc.)
  require ("$local\scheduler_table.pl"); # Datei-Inhalt als HTML-Tabelle

  • als Beispiel für einen shared-Modul und einen des lokalen Verzeichnisses (dieser hat selbst keine requires mehr, sondern verläßt sich darauf, daß das Hauptprogramm alles einbindet - das ist wahrscheinlich nicht die perfekte Lösung ...).

Einer meiner shared-Module (environment.pl, der dem Rest im Wesentlichen etwas Ähnliches wie %ENV zur Verfügung stellt, allerdings aus einer anderen Quelle) muß nun leider selbst wiederum einen anderen shared-Modul einbinden (parameter.pl, welcher eine Gruppe von Parameterdateien parst und das Ergebnis in diesen Hash schreibt - alles in einem Modul zu halten wird mir zu unübersichtlich, das wären dann fast 800 Zeilen).
Solange ich weiß, daß environment.pl von einem "klassischen Hauptprogramm" required wird, weiß ich *innerhalb* von environment.pl auch, daß ich parameter.pl über

use FindBin;
  require ("$FindBin::Bin\..\shared\parameter.pl");

ansprechen kann.

So, nun kommt mein Problem: Wenn ich "require environment.pl" in einem Perl-Programm verwenden will, das *nicht* in einem Verzeichnis derselben Ebene installiert ist, dann funktioniert das *innere* "require parameter.pl" nicht mehr, weil es ja relativ zum Hauptprogramm sucht.

Meine Frage also: Kann ich ein require innerhalb eines selbst wiederum mittels require formulierten Moduls so formulieren, daß ich von dort aus relativ zum Installationsort *dieses* Moduls adressieren kann?
(Also quasi ein FindBin:: nicht für das Hauptprogramm, sondern für einen Modul? Dann hätte ich gewonnen ...)
"." ist bereits Bestandteil von @INC, aber das nützt offenbar nichts, weil es ja auch nur das Verzeichnis des Hauptprogramms zu sein scheint. Ich brauche aber das Verzeichnis des Moduls!

Sinn der Sache ist folgender: Mein gesamtes System  wird beim Kunden an eine beliebige Stelle des Dateibaums installiert - deshalb suchen die Hauptprogramme sich ja dynamisch ihren Installationsort und adressieren andere Module relativ. Die Installationswurzel ist also nirgendwo statisch gespeichert.
Nun will der Kunde sich ein eigenes Skript schreiben, das meine Infrastruktur mitverwendet; ich will nun aber nicht, daß der Kunde gezwungen wird, sein Skript in meinem Produktbaum zu installieren (das würde natürlich funktionieren, aber - igitt ...). Der Kunden hat selbst ein Verzeichnis für User Exits, eigene Erweiterungen etc. in diesem Baum, kann von dort aus also relativ adressieren - aber er kann nicht die Grundlage dafür schaffen, daß *mein* inneres require funktioniert.

Hm, mal sehen, ob sich überhaupt jemand an dieses Problem herantraut - Frank? Cheatah?
(Die Firewall erlaubt mir keinen Zugriff auf Newsgroups, sonst hätte ich schon dort gefragt ...)