Autor Thema: Leerer Rückgabewert von fhem("...")  (Gelesen 152 mal)

Offline xenos1984

  • Full Member
  • ***
  • Beiträge: 193
Leerer Rückgabewert von fhem("...")
« 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...
  • ...nicht unterscheiden kann, ob der Befehl "" oder undef zurückgegeben hat? (Letzteres vielleicht als Rückgabe um einen Fehler zu signalisieren, ersteres dagegen als korrekter, aber leerer Rückgabewert, wie beim Calendar Beispiel.)
  • ...wenn mehrere Befehle "" zurückgeben, andere etwas nicht-leeres, man nicht unterscheiden kann, welcher Befehl was zurückgegeben hat?

 

decade-submarginal