[Vienna-pm] eval in fremden namespaces?
Wolfgang Laun
Wolfgang.Laun at alcatel.at
Wed Mar 1 06:21:08 PST 2006
Folgender Schnellschuss sollte einen ersten Ansatz darstellen.
my $expr = 'f($a,$b)+repro($m+$n,5)-$x2';
my $x = {funcs=>{f => sub { $_[0] + $_[1] },
repro => sub{ $_[0] * $_[1] },
},
vars=>{a=>4,
b=>5,
m=>10,
n=>10,
x2=>-10000,
x3=>2.334,
x4=>-343434}
};
sub fref {
my $name = shift;
return '&{$x->{funcs}->{' . $name . '}}';
}
# Klammern wegen Minus!
while( $expr =~ s/\$(\w+)/ '(' . $x->{vars}->{$1} . ')' /e ) {}
print "expr=$expr\n";
while( $expr =~ s/(\w+)\s*(?=\()/ fref( $1 ) /e ) {}
print "expr=$expr\n";
my $res = eval( $expr );
print "res=$res\n";
HTH
Wolfgang
peter pilsl wrote:
>also, das problem ist wie folgt. Ich haben einen textstring, der eine
>formeln und variablen und operatoren enthält ala
>
>f($a,$b)+repro($m+$n,434)-$x2-($x3+$x4)
>
>Und ich habe einen hash, der all diese funktionen und werte enthält:
>
>my $x={funcs=>{f=>sub{ ... },
> repro=>sub{....},
> ...
> },
> vars=>{a=>4,
> b=>5,
> m=>11,
> n=>989823,
> x2=>-11,
> x3=>2.334,
> x4=>-343434}};
>
>
>Nun möchte ich es irgendwie deichseln, dass ich den Textstring mittels
>eval von perl auswerten lassen kann, auf Basis der Funktionen und
>Variablen in meinem Hash. Mit einem passenden Deal von Objekten und
>Namespaces müsste das ja eigentlich irgendwie gehen, aber wenn ich
>darüber nachdenke, ende ich immer mit Kopfweh und einer Zigarette.
>
>Zusatzproblem ist, dass zB die Funktion repro in meinem aktuellen
>namespace durchaus auch schon anderwertig vergeben sein kann und das
>ganze irgendwo tief in einem namespace/objekt-Konstrukt definiert wird.
>Die Lösung, einfach mittels eval alle funktionen und variablen in meinem
>hash in den den aktuellen Gültigkeitsbereich zu holen und dann mit eval
>den string zu evaluieren, ist für mich (derzeit noch) keine Lösung. Da
>kommen dann sicher auch Garbagecollection-sorgen auf mich und meine
>mod_perl-Applikation zu.
>
>Die einzige Lösung, die ich derzeit habe, ist, selbst einen parser zu
>schreiben, was aber ziemlich doof ist, weil viel arbeit, um perl
>nochmals zu erfinden, oder aber mittels gefinkelten regexs meinen term
>so umzuschreiben, dass $a in $x->{vars}->{a} umgewandelt wird, was
>sicher immer wieder zu Problemen führt, weil es komische Formeln gibt,
>mit denen meine regex nicht gerechnet hat.
>
>danke,
>lgp
>
>
>
>
>
>
>
More information about the Vienna-pm
mailing list