ein Kapitel zurück                                           ein Kapitel weiter

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 zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf