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?