Subroutinen eines Moduls auslesen
|
Seitenanfang |
| Hallo Community! Ich habe ein kleines Problem, hinter das ich bei Perl nicht genau komme. Ich habe folgendes gemacht: in einem Unterordner kann man eigene Module ablegen, die etwas bestimmtes ausführen. Mein Skript liest dynamisch diese ganzen Module ein und möchte nun jeweils einen klar definierten Einstiegspunkt aufrufen, also eine bestimmte Funktion/Sub/Methode/Wasauchimmer, welcher meinetwegen ein "sub start_test" ist. So, kein Problem, solange alles ordnungsgemäß nach der von mir erstellten API abläuft. Wenn nun aber irgendwo ein Fehler auftaucht, weil irgendjemand darin ein Modul ablegt, was sich nicht genau an die Spezifikation hält (und mags nur ein Schreibfehler sein) geht alles schief. Das größte Problem, was ich erstmal filtern müsste, wäre die Tatsache, ob es in dem Modul tatsächlich ein sub "start_test" gibt. Ob dann die offensichtlich existierende Methode alles korrekt zurückliefert ist ne andere Geschichte. Mein Problem wäre also: wie kann ich von meinem "Hauptprogramm" aus erkennen, ob dieses sub tatsächlich in dem Modul existiert. Gibt es dafür eine Standardfunktion? Mir würde eine Liste der in einem Modul existierenden Subs am meisten gefallen. Sowas wie modname->has_sub oder @subs = modname->subroutines oder sowas in der Art.Problem: ich brauch eine standardmäßig von Perl mitgelieferte Lösung, kein extra CPAN-Modul. Ich würde ja daumäßig mit Regexp nach "sub start_test" suchen, aber das ist ja nicht wirklich sicher... ;) Eine Lösung wie oben wäre mir wesentlich angenehmer. Danke schonmal im Voraus, BigMarser
Datum: 15.01.2007-11:49

|
re: Subroutinen eines Moduls auslesen
|
Seitenanfang |
| Zu spät. Ich habe eine Lösung gefunden. :) Falls es jemand interessiert: Der Hash %packagename:: beinhaltet genau alle Methodennamen des Moduls (inklusive import). :) Trotzdem danke, falls sich jemand bemüht hat. BigM
Datum: 15.01.2007-12:25

|
re: Subroutinen eines Moduls auslesen
|
Seitenanfang |
je nachdem, was du genau wissen willst: ich wuerde es mit can() machen.
if $object->can('sub') { ...}; if (Klasse->can('sub') { ... };
can() berücksichtigt vereerbung.
Datum: 15.01.2007-12:43

|
re: Subroutinen eines Moduls auslesen
|
Seitenanfang |
ein paar klammern vergessen. leider kann man ja in diesem forum seine eigenen beiträge nicht editieren (vielleicht werde ich ja irgendwann erhört, wenn ich es nur oft genug wiederhole)
Datum: 15.01.2007-12:44

|
re: Subroutinen eines Moduls auslesen
|
Seitenanfang |
| "Der Hash %packagename:: beinhaltet genau alle Methodennamen des Moduls" ich weiss nicht, wie genau dein code aussieht, aber der hash beinhaltet noch mehr (evtl. package-variablen, typeglobs.) deshalb solltest du dann noch den typ bestimmen. wenn du dich einmal im wiki von perl-community umsiehst, findest du http://wiki.perl-community.de/bin/view/Wissensbasis/ObjektMethodenFinden warum soll man sich nochmal die mühe machen, wenn das problem schon gelöst wurde?
Datum: 15.01.2007-12:47

|
re: Subroutinen eines Moduls auslesen
|
Seitenanfang |
Ich habe kein Objekt, sondern nur ein Package. Wenn man das jedoch genauso behandeln kann, ok. So sehr perlschlau bin ich dann doch nicht :D Müsste dann aber nicht in jedem Modülchen in dem Ordner diese methods-Methode erscheinen? Scheint mir für meine Zwecke unzweckmäßig.Andererseits: die methods-Methode im Wikibeispiel arbeitet doch genau mit dem Hash, wenn ich den Code richtig interpretiere... *kratz* BigMarser
Datum: 15.01.2007-13:11

|
re: Subroutinen eines Moduls auslesen
|
Seitenanfang |
| "Müsste dann aber nicht in jedem Modülchen in dem Ordner diese methods-Methode erscheinen?" nein.
Datum: 15.01.2007-16:57

|
re: Subroutinen eines Moduls auslesen
|
Seitenanfang |
| "Andererseits: die methods-Methode im Wikibeispiel arbeitet doch genau mit dem Hash, wenn ich den Code richtig interpretiere... *kratz*" ja, aber richtig. ich weiss ja wie gesagt nicht, wie du es implementiert hast und was du genau willst. can() arbeitet halt mit vererbung, wenn du keine hast, ist es egal, dann ist can() wirklich das einfachste. ansonsten frag bei perl-community.de weiter, das forum ist komfortabeler, und da sitzen ein paar mehr experten als hier...
Datum: 15.01.2007-16:59

|