![ein Kapitel weiter](../weiter.gif)
In Perl ist es im Gegensatz zu C möglich, während der Laufzeit
Programmcode dynamisch zu erzeugen und Auszuführen. eval()
ist eine sehr mächtige Funktion. Ich werde nur auf die Grundlegenden
Funktionen von eval() eingehen.
eval() können sie auf zwei Verschiedenen Arten verwenden. Zum einen
als Codeangabe in Strings....
#!/usr/bin/perl -w
print "Bitte geben sie einen Code ein : ";
chomp($code=<>);
eval $code; #Code wird ausgeführt
Sie können ja Beispielsweise folgendes eingeben.....
Bitte geben sie einen Code ein : print $value=20*10 , "\n";
Die Ausgabe ist anschließend 200. Vorraussetzung ist natürlich
das sie ausführbaren Code eingeben.
Von der Stringmethode Code zu evaluieren wird aber aus Sicherheitsgründen
abgeraten. Da man nicht davon ausgehen kann das alle Benutzer einfache
Anwender sind, kann ein Spassvogel schnell dazu Übergehen, gefährlichen
Code einzugeben.
Die zweite Möglichkeit ist es denn Code in geschweiften
Klammern zu Schreiben.......
#!/usr/bin/perl -w
while(1){
eval { $wert1=<>; $wert2=<>; $erg=$wert1/$wert2 };
print "Ergebnis : $erg \n" unless $@;
}
Der Vorteil an dieser Schreibweise ist das der Code,
zur Kompilierzeit nur einmal geparst wird. Geben sie in
diesem Beispiel als Wert eine ungültiges Zeichen ein,
wird anstatt das Programm abgebrochen, ein Fehlercode
ausgegeben. Dieser Fehlercode befindet sich in der reservierten
Variablen $@
Tritt kein Fehler auf ist diese Variable leer.
Ein Sinnvolle Anwendung von eval() wäre die Auswertung einer
Ausnahmebehandlung ala try() und catch() wie sie in C++ oder
Java verwendet wird......
try{ /*Code der Ausnahme auslösen könnte*/ }
catch { /*Code der die Ausnahme behandelt*/ }
Und hier das ganze in der Praxis in Perl.....
#!/usr/bin/perl -w
$wert1=<>;
$wert2=<>;
chomp $wert1;
chomp $wert2;
eval { $ergebnis=$wert1/$wert2; }
or do{ print "FEHLER_HANDLER : $@\n" if $@;
$ergebnis=0;
};
print "$ergebnis \n";
Mit diesem Programm können wir zum Beispiel verhindern das unser
Programm bei einer Division durch 0 nicht abruppt abgebrochen wird.
In eval{...} evaluieren wir den Code. Falls eine reguläre Division
erfolgt wird dies als Ergebnis ausgegeben. Falls wir aber zum
Beispiel 5/0 rechnen wollen, geht es in den or do Anweisungsblock.
In diesem wird die reserviert eval-Fehler-Variable ($@) überprüft,
ob sich darin etwas befindet. Wenn ja wird der unser Fehlerhandler
ausgeführt und die Variable $ergebnis auf 0 gesetzt.
Wie gesagt das Thema eval() ist sehr Umfangreich und ich habe es nur
grob gestriffen.
![ein Kapitel weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|