Tipps und Tricks zu Perl und CPAN-Modulen

Relative lib-Verzeichnisse mit rlib

Beitrag von Uwe am 27.11.2008 um 21:40 Uhr | 0 Kommentare

Bei meinen Perl-Projekten hat sich mit den Jahren eine gewisse Grundstruktur herausgebildet. So trenne ich Module (Verzeichnis "lib") und Skripte (Verzeichnis "perl"). Es gibt noch weitere Verzeichnisse, aber die spielen für das heutige Thema keine Rolle. :-)

Nun möchte ich in meinen Perl-Skripten das lib-Verzeichnis dem Include-Pfad hinzufügen. Dies kann in Perl auf verschiedene Weisen geschehen. "perldoc -q @INC" liefert dazu:

PERL5LIB=/proj/lib perl skript.pl

perl -I/proj/lib skript.pl

use lib "/proj/lib";

Ich versuche allerdings, absolute Pfade zu vermeiden. Arbeitet man zum Beispiel mit mehreren Entwicklern an einem Projekt wird meist ein Versionskontrollsystem wie Subversion eingesetzt. Dabei kann es passieren, daß nicht jeder den gleichen Pfad verwendet (z. B. weil der Quelltext ins Home-Verzeichnis ausgecheckt wurde). Gerade innerhalb eines Projektes verwende ich aus diesem Grund relative Pfade.

Dabei ist ein

use lib "../lib";

aber ungünstig. Denn wird das Skript aus einem anderen Verzeichnis heraus aufgerufen (z. B. mit "perl perl/skript.pl"), so funktioniert das lib-Verzeichnis nicht gefunden. Der relative Pfad muß also korrigiert werden, wenn das aktuelle Verzeichnis nicht das perl-Verzeichnis ist.

Für diesen Zweck ist das Modul FindBin geeignet. Mit der Variable $FindBin::Bin läßt sich das Verzeichnis des Perl-Skripts ermitteln:

use FindBin;
use lib "$FindBin::Bin/../lib";

Um jetzt zum Titel dieses Beitrags zurückzukommen: Dies läßt sich mit dem Modul (bzw. Pragma) rlib in einer Zeile erledigen:

use rlib '../lib';

Wird kein Verzeichnis angegeben, nimmt rlib "../lib" und "lib" an. Folglich würde für unser Beispiel diese Zeile genügen:

use rlib;

Eine Anmerkung noch zum Thema Modul/Pragma: Wie ich oben schrieb, handelt es sich bei rlib (ebenso wie strict und warnings) um ein Pragma. Pragmas sind Perl-Module, die während der Übersetzung ("compile time") wirken. Sie sind an der kompletten Kleinschreibung des Modulnamens zu erkennen.


Kommentar abgeben