FHEM Forum

FHEM - Entwicklung => Wunschliste => Thema gestartet von: xenos1984 am 11 September 2020, 21:34:13

Titel: Leerer Rückgabewert von fhem("...")
Beitrag von: xenos1984 am 11 September 2020, 21:34:13
Mir ist gerade folgendes Verhalten aufgerufen. Wenn ich einen Befehl (im konkreten Fall ein "get events" von einem Calendar device) mittels fhem("...") in Perl aufrufe, und das Modul als Rückgabe eine leere Zeichenkette "" liefert (weil z.B. keine passenden Events im Kalender sind), liefert fhem("...") nicht diese Zeichenkette zurück, sondern undef. Aufgefallen ist mir das durch eine Warnung im Code
fhem("...") eq ""
dass ersteres nicht definiert wäre - stattdessen musste ich es in
!defined fhem("...")
ändern.

Das Verhalten kommt offenbar aus der fhem.pl. Dort ruft fhem() seinerseits AnalyzeCommandChain() auf, und das wiederum AnalyzeCommand(), wo sich folgender Code befindet:
1257   return undef if(defined($ret) && $ret eq "");
1258   return $ret;

Erfüllt das einen bestimmten Zweck, dass hier undef statt "" zurückgegeben wird? Gut, in AnalyzeCommandChain() passiert dann das:
1106     my $lret = AnalyzeCommand($c, $subcmd, "ACC");
1107     push(@ret, $lret) if(defined($lret));

Also werden nur die Rückgabewerte einer mittels ; getrennten Sequenz von Befehlen zurückgegeben, die definiert (d.h. nicht undef) sind. Wegen der vorherigen Ersetzung werden also auch leere Zeichenketten "" ausgefiltert. Und wenn @ret keine Einträge enthält, wird wieder undef übergeben:
1111   return join("\n", @ret) if(@ret);
1112   return undef;

Das Ergebnis wird dann auch so von fhem() zurückgegeben.

Ich vermute mal, dass das seinen Grund hat, warum dieses Verhalten so eingebaut wurde, auch wenn sich dieser mir auf den ersten Blick nicht erschließt... Man kann also keine "" aus einem Modul zurückgeben, bzw. bekommt stattdessen undef. Führt das nicht zu Schwierigkeiten, weil man...