Thread Beispiel für die (sichere?) Verwendung von eval (12 answers)
Opened by Ronnie at 2008-09-28 12:44

sid burn
 2008-10-07 12:05
#115239 #115239
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
"eval is not evil!" ;)

Als erstes muss man bei Perl sagen welches eval man meint. Leider nutzt Perl ja für Exception fangen ebenfalls eval. Also gegen den Block eval kann man definitiv sagen das dieser nicht evil ist und man ihn sooft verwenden sollte wie es nur geht. Leider wirft Perl ja nicht bei allen Sachen Exceptions und leider immer noch oft genug blöde "undefs" oder andere return Werte zurück um ein Fehler zu Signalisieren.

Ansonsten kann das String eval auch für gute Sachen genutzt werden. Denn man kann damit ja Code zur Laufzeit generieren. Diese Flexibilität kann man dazu nutzen Code wirklich stark abzukürzen oder sogar die Performance eines Programmes erheblich zu steigern. Und wenn man den Code komplett selber generiet ohne Usereingaben zu beinhalten kann dort auch kein Nutzer Code einschleussen oder eine Sicherheitslücke ausnutzen.

Ein zusätzliches Beispiel hierfür von mir ist auch schon fast knapp 2 jahre alt und hier zu finden:
http://forum.ubuntuusers.de/topic/perl:-20fache-la...

Hier nutze ich String Eval und das Programm ist danach fast 20mal schneller. Allerdiengs hätte ich dort auch vorkompilierte Regexe nutzen können (qr//), was ich auch geschrieben habe. Dies wäre auch meine persönliche bevorzugte Variante.


Die Nachteile von String evals und der Codegenerierung sind eher das diese absolut schlecht wartbaren Code erzeugen. Es ist kompliziert nachzuvollziehen was zusammengebaut wird, und es abzuändern.

Und dazu kommt noch das für die meiste Code Generierrung bessere einfachere Möglichkeiten gibt. Dafür hat man ja Typeglobs, Subroutinenreferenzen etc. Sprichwort "Funktionale Programmierung".


So wie du eval genutzt hast würde ich es ehrlich gesagt nicht nutzen. Da auch eine manuelle Überprüfung immer Fehler enthalten kann. Und da du sowieso schon die ganzen Regexe geschrieben hast für die einzelnen Tokens hättest den ganzen String auch mit den Regexoptionen "m//gc" Schrittweise durchgehen können und Parsen können. Wäre auch nicht sehr viel komplexer gewesen.


Mein Fazit ist also das String eval nicht unbedingt evil ist wenn man es zur Code generierung nutzt, allerdiengs sind hier die Möglichkeiten der "Funktionalen Programmierung" besser (im Sinne von flexibilität, wartbarkeit).
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Beispiel für die (sichere?) Verwendung von eval