Schrift
[thread]7757[/thread]

eval

Leser: 6


<< >> 10 Einträge, 1 Seite
Froschpopo
 2006-03-03 01:12
#63427 #63427
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
startet eval() eigentlich zur laufzeit nen eigenen Compilerprozess oder wie kann der zwischenzeitlich nen code evaluieren???
Wenn das zutrifft, müsste das ja nen Script ordentlich lahmer machen oder nicht?
Dubu
 2006-03-03 10:07
#63428 #63428
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Du musst unterscheiden zwischen String-eval und Block-eval.
Bei String-eval wird tatsächlich der im String enthaltene Code zur Laufzeit kompiliert (ich glaube allerdings nicht, dass dafür ein eigener Prozess gestartet wird, langsamer ist es trotzdem).
Beim Block-eval werden dagegen für den Block Fehlerkontrollen, die sonst zum Abbruch führen würden, abgeschaltet, damit man seine eigene Fehlerabfrage machen kann (analog zu Exceptions in anderen Sprachen).

Die Antworten lauten also:
String-eval: Ja. Ja.
Block-eval: Nein. Nein.
ptk
 2006-03-03 11:07
#63429 #63429
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Dubu,03.03.2006, 09:07]Du musst unterscheiden zwischen String-eval und Block-eval.
Bei String-eval wird tatsächlich der im String enthaltene Code zur Laufzeit kompiliert (ich glaube allerdings nicht, dass dafür ein eigener Prozess gestartet wird, langsamer ist es trotzdem).[/quote]
Es wird kein eigener Prozess gestartet.
Gast Gast
 2006-03-08 10:47
#63430 #63430
Hallo!

Dazu habe ich auch eine Frage/Problem ...

Ich habe ein Perl-Script geschrieben, das von Usern via "Makro" erweitert werden kann. Dieses Makro ist eine einfache sub, die in einem externen Modul in das Script geladen wird und via eval() ausgeführt wird.

Bsp:

Code: (dl )
1
2
3
4
5
# Script / Hauptprogramm

use externe_makros;
my $test=12;
eval("externe_makros::makro1(\$parameter1)");


Soweit auch alles super. Wenn aber nun das makro1 aus dem externen Modul eine Variable ändern soll, z.B. $test, dann klappt das nicht ... das Lesen der Variable aber wunderbar.

Code: (dl )
1
2
3
4
5
# Modul: externe_makros

sub makro1 {
$main::test=42;
}


Innerhalb der sub scheint das Setzen auch zu klappen. Also ein "print $main::test" in der sub bringt das korrekte Ergebnis (42). Ein "print $test" im Script selber liefert 12 ...

Nun meine Frage :roll: Wie kann ich in dem Makro eine Variable im Hauptprogramm/Script neu setzen? Wo liegen die Grenzen von eval()? Wo ist der Unterschied zwischen String und Block eval?

Ich hoffe, Ihr versteht mein Anliegen ...

Vielen Dank und schöne Grüße,
chris
renee
 2006-03-08 13:20
#63431 #63431
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
warum machst Du überhaupt ein eval??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2006-03-08 16:19
#63432 #63432
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Guest,08.03.2006, 08:47][...]
Nun meine Frage :roll: Wie kann ich in dem Makro eine Variable im Hauptprogramm/Script neu setzen? Wo liegen die Grenzen von eval()? Wo ist der Unterschied zwischen String und Block eval?
[...][/quote]
In Deinem Beispiel ist das Problem, dass die lexikalische Variable $test im Hauptprogramm die globale Variable $test überschattet, die du in dem externen Makro setzt. Du könntest an der Stelle entweder our statt my verwenden oder dem Makro eine Referenz auf die Variable, die es setzen soll, übergeben.

Was die Frage zu den "Grenzen von eval" betrifft, so verstehe ich wohl nicht ganz, worauf Du hinauswillst. In einem eval kann genau der gleiche Code ausgeführt werden wie auch im Hauptprogramm, es sei denn man verwendet spezielle Tricks um die Ausführung sicherer zu machen (siehe zum Beispiel Safe).

Der Unterschied zwischen String-eval und Block-eval ist der, dass Block-eval kein eval ist ;-) Bei einem String-eval wird der Code im String zur Laufzeit des Programmes kompiliert und dann ausgeführt. Ein Block-eval ist hingegen nur eine Anweisung für den Compiler, die besagt, dass Fehler, die innerhalb des Blocks auftreten, nicht zum Abbruch des Programmes führen, sondern abgefangen und in speziellen Variablen zur weiteren Auswertung gespeichert werden sollen.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2006-03-09 12:02
#63433 #63433
[quote=murphy,08.03.2006, 15:19][quote=Guest,08.03.2006, 08:47][...]
Nun meine Frage :roll: Wie kann ich in dem Makro eine Variable im Hauptprogramm/Script neu setzen? Wo liegen die Grenzen von eval()? Wo ist der Unterschied zwischen String und Block eval?
[...][/quote]
In Deinem Beispiel ist das Problem, dass die lexikalische Variable $test im Hauptprogramm die globale Variable $test überschattet, die du in dem externen Makro setzt. Du könntest an der Stelle entweder our statt my verwenden oder dem Makro eine Referenz auf die Variable, die es setzen soll, übergeben.

Was die Frage zu den "Grenzen von eval" betrifft, so verstehe ich wohl nicht ganz, worauf Du hinauswillst. In einem eval kann genau der gleiche Code ausgeführt werden wie auch im Hauptprogramm, es sei denn man verwendet spezielle Tricks um die Ausführung sicherer zu machen (siehe zum Beispiel Safe).

Der Unterschied zwischen String-eval und Block-eval ist der, dass Block-eval kein eval ist ;-) Bei einem String-eval wird der Code im String zur Laufzeit des Programmes kompiliert und dann ausgeführt. Ein Block-eval ist hingegen nur eine Anweisung für den Compiler, die besagt, dass Fehler, die innerhalb des Blocks auftreten, nicht zum Abbruch des Programmes führen, sondern abgefangen und in speziellen Variablen zur weiteren Auswertung gespeichert werden sollen.[/quote]
Hi!

Vielen Dank für Deine Antwort! Das hilft mir doch schon sehr weiter!

Mit Grenzen meinte ich: Wieviel Code kann ich dem eval übergeben? 100 Zeichen? 1000 Zeichen? 10000 Zeichen? Oder ist das eigentlich wurscht?

Vielen Dank und schöne Grüße,
Chris
renee
 2006-03-09 12:09
#63434 #63434
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Soweit ich weiss, ist das nicht begrenzt, aber nochmal die Frage: Warum verwendest Du überhaupt eval??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2006-03-10 04:12
#63435 #63435
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hierfür:
Code: (dl )
1
2
3
4
5
if (exists $ENV{mod_perl})
{
eval "require mod_perl";
# ...
}
renee
 2006-03-10 10:53
#63436 #63436
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Meine Frage richtete sich eigentlich simps1 - sorry für die Unklarheit - denn bei ihm ist das nicht notwendig...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 10 Einträge, 1 Seite



View all threads created 2006-03-03 01:12.