Thread Perl-Modul mit dazugehörigen, dynamisch gelesenen Dateien
(10 answers)
Opened by defun at 2008-07-18 01:22
Ich möchte ein Perl-Modul schreiben, das eine unbekannte Anzahl von Text-Dateien "besitzt", die sich in einem Ordner befinden, dessen Namen wir kennen und der im gleichen Verzeichnis wie das Modul liegt. Unbekannt ist die Anzahl deshalb, weil der User jederzeit eigene Text-Dateien in einem speziellen Format hinzufügen oder unerwünschte entfernen kann.
Konkret handelt es sich bei mir um das Modul "ErrorText", das (mehrsprachige) Fehlertexte für eine Reihe verwandter Module verwaltet. Nun braucht ein User vielleicht keine polnischen Fehlermeldungen und will sie daher löschen, oder er will französische hinzufügen, die er irgendwo im Internet gefunden hat. Das Problem: Um die Dateien zu lesen, müsste ich den konkreten Ordner nach den vorhandenen Dateien durchsuchen, also z.B. ErrorText/. Aber wenn nun ein Script, sagen wir mal doIt.pl, das ErrorText-Modul lädt, ist das momentane Arbeitsverzeichnis natürlich ganz falsch. Sagen wir mal, ErrorText.pm und der ErrorText-Ordner liegen im Verzeichnis "/Library/Perl" (Mac OS X-Style) und das Script liegt im Home-Verzeichnis. Dann weiß das ErrorText-Modul nicht, wie es auf seine eigenen Dateien zugreifen soll, weil ein opendir mit einem relativen Pfad im Home-Verzeichnis suchen würde. Mit absoluten Pfaden zu arbeiten fände ich hingegen scheisse, weil sich dann ja jedes ErrorText-Modul dem jeweiligen System anpassen müsste, d.h. ein Installations-Mechanismus wäre vonnöten. Ich mag aber Drag&Drop-Installationen von (zumindest meinen eigenen) Modulen lieber. Mein Lösungsansatz: Ich durchlaufe die Einträge von @INC, und checke jeweils, ob ein Verzeichnis "$_/ErrorText" vorhanden ist (natürlich mit einem plattformunabhängigen Mechanismus für den Pfad). Überall, wo ich Erfolg habe, öffne ich den Ordner und durchsuche ihn nach passenden Dateien. Diese lese ich ein. Man könnte meinen, dass ich mit dieser Methode übers Ziel hinausschieße, indem ich evtl. falsche Ordner einlese. Aber das kann ja sogar noch als Feature angesehen werden, weil ein User so eigene Ordner mit Text-Dateien in ein anderes Verzeichnis legen kann, welches in @INC steht, also evtl. per -I-Option übergeben wurde. Allerdings fällt mir auch nicht ein, wie man dieses "Feature" sicher "deaktivieren" könnte, also eindeutig nur den Ordner einlesen, der sich beim Modul befindet. In meinem Fall ist dieses Problem zu vernachlässigen, weil es sich um zwei verschachtelte Ordner handelt und die Text-Dateien sogar eine eigene Endung haben. Daher mache ich mir keine echten Sorgen. Ist diese Lösung OK oder ist sie total uncool und daneben? Gibt es eine direktere Lösung? |