Wie implementiere ich Plugins?

Wie implementiere ich Plugins?

am 27.07.2007 18:05:04 von Marc Haber

Hallo,

ich habe ein kleines Projekt, das an einer Stelle Magie braucht, die
teilweise von außen kommen soll: In einem Verzeichnis sollen Dateien
liegen, die perl-Code enthalten. Ich möchte nun aus einer nach der
anderen dieser Dateien Code ausführen, bis einer der Codeschnipsel ein
Ergebnis produziert. Am liebsten hätte ich den entsprechenden Code in
ein Array von Funktionen gezogen, damit dann Code der Form


foreach $func( @funcarray ) {
$output =3D $$func(input);
break if $output;
}

möglich wird (nagelt mich nicht auf Interpunktion fest, mit der steh
ich chronisch auf Kriegsfuß).

Wie muss dann der Code in den einzelnen Dateien im Zielverzeichnis und
mein Vorbereitungscode aussehen? Ich vermute mal, dass die einzelne
Datei im Zielverzeichnis eine Funktion definieren muss und den Namen
dieser Funktion an das Array appenden muss, und der Vorbereitungscode
muss über die Dateien im Verzeichnis iterieren und jede einzelne Datei
requiren. Seh ich das richtig so?

Gibt es dafür vielleicht ein fertiges Modul, oder hat jemand
griffbereiten Code zum Pasten? Oder bin ich ganz auf dem Holzweg?

Danke für Eure Tipps.

Grüße
Marc

--=20
-------------------------------------- !! No courtesy copies, please !! =
-----
Marc Haber | " Questions are the | Mailadresse im =
Header
Mannheim, Germany | Beginning of Wisdom " | =
http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 =
72739834

Re: Wie implementiere ich Plugins?

am 27.07.2007 21:15:01 von Slaven Rezic

Marc Haber writes:

> Hallo,
>
> ich habe ein kleines Projekt, das an einer Stelle Magie braucht, die
> teilweise von außen kommen soll: In einem Verzeichnis sollen Dateien
> liegen, die perl-Code enthalten. Ich möchte nun aus einer nach der
> anderen dieser Dateien Code ausführen, bis einer der Codeschnipsel ein
> Ergebnis produziert. Am liebsten hätte ich den entsprechenden Code in
> ein Array von Funktionen gezogen, damit dann Code der Form
>
>
> foreach $func( @funcarray ) {
> $output = $$func(input);
> break if $output;
> }
>
> möglich wird (nagelt mich nicht auf Interpunktion fest, mit der steh
> ich chronisch auf Kriegsfuß).
>
> Wie muss dann der Code in den einzelnen Dateien im Zielverzeichnis und
> mein Vorbereitungscode aussehen? Ich vermute mal, dass die einzelne
> Datei im Zielverzeichnis eine Funktion definieren muss und den Namen
> dieser Funktion an das Array appenden muss, und der Vorbereitungscode
> muss über die Dateien im Verzeichnis iterieren und jede einzelne Datei
> requiren. Seh ich das richtig so?
>
> Gibt es dafür vielleicht ein fertiges Modul, oder hat jemand
> griffbereiten Code zum Pasten? Oder bin ich ganz auf dem Holzweg?
>

Ein fertiges Modul braucht man hier wirklich nicht. In Perl kann man
Code mit "do", "require" oder dem Einlesen der Datei und einem
anschließenden "eval" nachträglich einlesen. Das könnte beispielsweise
so aussehen:

for my $codefile (glob("/pfad/zum/funktionsrepository/*.pl")) {
my $func = do $codefile;
die if !$func; # um Kompilationsfehler abzufangen
my $output = $func->(); # ggfs. Parameter übergeben
...
}

Die Codedateien enthalten hier einfach eine anonyme Subroutine, also

sub {
...
};

und nichts weiter. Die Verwendung von anonymen Subroutinen hat den
Vorteil, dass du keine Namespace-Probleme bekommst. Natürlich könntest
du auch benamte Subroutinen verwenden.

Man könnte sich auch etwas mit AUTOLOAD basteln. Falls du diese Loop
öfters ausführst und Zeit für das Parsen sparen möchtest (bei "do"
wird jedesmal geparst), solltest du "require" stattdessen verwenden.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de

tkruler - Perl/Tk program for measuring screen distances
http://ptktools.sourceforge.net/#tkruler

Re: Wie implementiere ich Plugins?

am 28.07.2007 10:02:05 von Marc Haber

Slaven Rezic wrote:
>Ein fertiges Modul braucht man hier wirklich nicht. In Perl kann man
>Code mit "do", "require" oder dem Einlesen der Datei und einem
>anschließenden "eval" nachträglich einlesen. Das könnte =
beispielsweise
>so aussehen:
>
> for my $codefile (glob("/pfad/zum/funktionsrepository/*.pl")) {
> my $func =3D do $codefile;
> die if !$func; # um Kompilationsfehler abzufangen
> my $output =3D $func->(); # ggfs. Parameter übergeben
> ...
> }
>
>Die Codedateien enthalten hier einfach eine anonyme Subroutine, also
>
> sub {
> ...
> };

Das tut sehr gut, vielen Dank für Deine Hilfe!

Grüße
Marc

--=20
-------------------------------------- !! No courtesy copies, please !! =
-----
Marc Haber | " Questions are the | Mailadresse im =
Header
Mannheim, Germany | Beginning of Wisdom " | =
http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 =
72739834