FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Elektrolurch am 27 Juni 2015, 21:26:44

Titel: perl: eval kontra &{$proc}($params...)
Beitrag von: Elektrolurch am 27 Juni 2015, 21:26:44
Hallo,

es gibt ja zwei Möglichkeiten, eine Funktion (sub) aufzurufen, dessen Namen in einer Variablen gespeichert wurde.
Mich würde mal der (Performance)-Unterschied interessieren, beide Varianten werden hier in fhem verwendet.

1. per eval
# externe Funktion aufrufen
my $proc = AttrVal( $name, "notifyFn", "" );
if( $proc =~ m/^{.*}$/ )
{
my $NAME = $mname;
my $EVENT = $s;
my $res = eval $not_fn;
} # notifyFn

In $proc steht der komplette Aufruf einer sub mit Variablen, die hier lokal auch vorhanden sein müssen (deshalb die  lokale Zuweisung auf $NAME und $EVENT, damit die "Konvention" stimmt)
Muss für eval der Ausdruck tatsächlich in '{   ... }' eingeschlossen sein, so wie es hier in fhem häufig abgefragt wird?

Variante 2:
Wenn ich das richtig verstehe, dann wird in Variante 1 der perl-Interpreter aufgerufen. In Variante 2 wird der Name der sub, der in einer Variablen gespeichert wird (wie z.B. in $modules->{defFn}) in der internen Tabelle von perl der suroutinen nachgeschlagen und angesprungen:
no strict "refs";
   
&{$hzhash->{METHOD}}($hzhash,$low, $high);
    use strict "refs";

Hierbei müsswen für alle verschiednenen Prozeduren die Pararameter natürlich bezüglich ihrer semantische Bedeutung immer gleich sein.

Mich würden die beiden Varianten bezüglich Performance und Ausführungssicherheit interessieren.
Meinung? Wissen?

Elektrolurch
...und ich sage "pah", wenn jemand sich nur zu Tipp-Fehlern äußert.