PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Perl] Laden von Modulen, deren Namen in einer Variable gespeichert ist



Technaton
27-09-2005, 15:51
Grüße! :)

In meinem aktuellen Skript muß ich ein Dokument auf "Macrodefinitionen" untersuchen. Die Sache ist recht einfach, es gibt Tag-artige Elemente, die zeigen, daß eine Macrodefinition folgt, mit einem regulären Ausdruck wird dann der Name extrahiert.

Perlintern soll das ein Modul sein, das dann eingebunden wird. Per Schnittstellendefinition muß ein Modul eine Funktion namens "delegate" implementieren, die dann aufgerufen wird. Imports sollten vermieden werden.

Im Moment löse ich das folgendermaßen:


# m//io; wird auf die aktuelle Zeile angewandt, Macroname ist in $1, evtl. Paramter in $2
require "$1.pm";
eval qq/$1::delegate("$2")/;
Und ich finde, das sieht ziemlich häßlich aus, denn eval macht das Skript ziemlich langsam. Gibt's eine elegantere Methode, um das zu lösen?

Gruß,
Techl

Technaton
28-09-2005, 18:02
So, nach einiger Recherche und dem Vor-lauter-Bäumen-den-Wald-nicht-mehr-gesehen-Gefühl habe ich's jetzt so gelöst:


# Prepare call:
my $pm_name = $1;
my $sub_name = "$pm_name".'::delegate';
(my $pm_param_string = $3) =~ s/^\((.*)\)$/$1/;
my @sub_param = split(/\s*,\s*/,$pm_param_string);

# Disable strict refs to allow symbolic references:
no strict 'refs';

# Load perl module:
require "$pm_name.pm";

# Do the call:
&$sub_name(@sub_param); Sollte das in Larry's Augen eine absolute Ekligkeit darstellen, dann weißt mich bitte darauf hin :) Andernfalls ist die Sache hiermit erledigt.