Thread eval is evil: Willkommen auf der dunklen Seite?! (19 answers)
Opened by Ronnie at 2006-11-22 21:21

sid burn
 2006-11-22 23:40
#71919 #71919
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ich habe das Buch "Fortgeschrittene Perl Programmierung". 1.Auflage (nicht zweite). Das Buch ist zwar schon alt und von 1998 aber durch dieses Buch muss ich sagen lernt man richtig die Vorzüge von eval, und er zeigt auch was alles so Möglich. Klar "kann" eval() böse sein, aber mitlerweile finde ich das man damit mehr Sinvolle Sachen tun kann. Und ich bin auch nicht mehr der Auffassung das es Grundlegend Böse ist.

Ansonsten wenn du eine Subroutine in einem String schreibst, dann musst du daerstmal daran denken das dies erstmal ein normaler String ist, wo auch Variableninterpolation stattfinden kann. Wenn du also eine Subroutine erzeugen möchtest die nachher den wirklichen Perlcode "my $var = shift" ausführt, musst du beachten das du das Dollarzeichen bei $var escapest. Wenn du es nicht machst dann würde vor dem eval noch versucht werden $var im String zu interpolieren, und das ergebnis führst du dann erst aus. Und das willst du wahrscheinlich nicht.

Ansonsten wenn dein Ablauf im Programm identisch ist, und sich nur Funktionsname oder Variablennamen ändern dann würde es sich viel mehr Lohnen wenn du einfach die Symboltabelle bearbeitest. Das hat den Vorteil meiner Meinung nach das es besser lesbar ist. Andere Vorteile sind das die Syntax auch weitestgehenst schon zur Compilierzeit überprüft wird, und bei String eval geschieht ja alles nur komplett zur Laufzeit.

In einem anderen Forum hatte ich mal ein kleines Beispiel für eval gegeben wie sich noch Performance heraus schlagen liese. Vielleicht hilft dir dieses kleine Beispiel etwas weiter.

Wenn du es das Programm ausführst dann siehst du welchen Perl Code ich in $code zusammengebaut habe. Wenn ich diesen Code ausführen möchte, dann müsste man einfach nur "eval $code;" schreiben.

Du musst eigentlich nur dran denken das du es mit einem String zu tun hast, und die richtigen Zeichen escapen musst.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my @regexe = (
qr/Ausdruck0/,
qr/Ausdruck1/,
qr/Ausdruck2/,
qr/Ausdruck3/,
);

my @zaehler;

my $code = "while ( my \$zeile = <SUCHE> ) {\n";
for my $i ( 0 .. $#regexe ) {
$code .= "\tif ( \$zeile =~ m/$regexe[$i]/ ) { \$zaehler[$i] }\n";
}
$code .= "}\n";

print $code;
\n\n

<!--EDIT|sid burn|1164231805-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread eval is evil: Willkommen auf der dunklen Seite?!