eval und Filter::exec

eval und Filter::exec

am 22.04.2008 10:56:36 von kbsoft

hi,

ich verwende in meinen Scripten Filter::exec. Das funktioniert auch
gut. Nun wollte ich diese Scripte mit Hilfe eines 'embedded
persistent' servers ausführen lassen. Dieser Server lädt einfach das
Script in eine Variable und macht dann eval auf diese Variable. Da es
nicht funktionierte, habe ich einfach das Script von Hand in die
Variable gepackt und eval ausgeführt. Tatsächlich scheint es so, als
ob eval Filter::exec nicht ausführen kann.

Kann es bitte jemand bestätigen, oder sollte ich weiter suchen.

Gruss
Jan

Re: eval und Filter::exec

am 22.04.2008 11:28:53 von Frank Seitz

kbsoft@gmx.de wrote:
>
> ich verwende in meinen Scripten Filter::exec. Das funktioniert auch
> gut. Nun wollte ich diese Scripte mit Hilfe eines 'embedded
> persistent' servers ausführen lassen. Dieser Server lädt einfach das
> Script in eine Variable und macht dann eval auf diese Variable. Da es
> nicht funktionierte, habe ich einfach das Script von Hand in die
> Variable gepackt und eval ausgeführt. Tatsächlich scheint es so, als
> ob eval Filter::exec nicht ausführen kann.
>
> Kann es bitte jemand bestätigen, oder sollte ich weiter suchen.

Habe mit Filter::exec keine Erfahrung. Aber da ein Source-Filter
zur Compile-Time ausgeführt wird, eval() aber zur Runtime,
passt das nach meinem Verständnis grundsätzlich nicht zusammen.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: eval und Filter::exec

am 23.04.2008 17:45:25 von Ferry Bolhar

Jan:

> ich verwende in meinen Scripten Filter::exec. Das funktioniert auch
> gut. Nun wollte ich diese Scripte mit Hilfe eines 'embedded
> persistent' servers ausführen lassen. Dieser Server lädt einfach das
> Script in eine Variable und macht dann eval auf diese Variable. Da es
> nicht funktionierte, habe ich einfach das Script von Hand in die
> > ob eval Filter::exec nicht ausführen kann.
>
> Kann es bitte jemand bestätigen, oder sollte ich weiter suchen.

Source Filter (auf denen Filter::exec basiert) beziehen sich stets
auf den "Current Input Path", d.h., jene Datei, die Perl gerade
einliest, wenn der Filter eingerichtet wird. Sie sind daher nur
beim Einlesen von Code-Dateien wirksam. In string-evals (zu denen
auch ein "eval $code;" gehört), finden sie keine Beachtung mehr.

Den Unterschied sieht man z.B. mit folgenden Code:

my $str = 'print __FILE__';
eval $str;

ergibt "(eval 1)", d.h., die "Code-Datei" ist hier keine echte
Datei, für die Leseoperationen (die Source-Filter verwenden)
ablaufen werden.

Aber Filter::exec macht nichts, was du nicht auch mit einer
manuell eingerichteten Pipe, durch die du deinen Code jagst,
machen könntest.

@Frank: Source-Filter werden in BEGIN-Blöcken ausgeführt,
und diese sind - im Gegensatz zu CHECK und INIT-Blöcken -
auch in eval's zur Laufzeit erlaubt; insoferne ist das also
kein Widerspruch. Aber es ist ganz einfach so, dass Source-
Filter durch den Parsercode, der die Code-Datei einliest,
aufgerufen werden. Bei einem String-eval wird nichts mehr
eingelesen und daher werden auch keine Source-Filter aufgerufen.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolhar-nordenkampf@wien.gv.at