[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