In diesem Thread http://forum.fhem.de/index.php/topic,27011.msg199677.html#msg199677 geht es um die Frage ein "at" auf die Existenz abzuprüfen.
Zwei Lösungsvarianten wurden vorgeschlagen:
a) Prüfung mit if(defined($defs{'objekt'}))...
b) Prüfung mit if(exists($defs{'objekt'})) ...
Welche Variante ist nun die Bessere/Richtigere?
Ich meine a) mit defined, da universeller:
Mit exists prüft man die reine Existenz eines Hash-Elementes, Wert interessiert nicht.
Mit defined prüft man, ob ein Hash-Element einen Wert anders als "undef" hat. Also neben Existenz des Hash-Elements auch den (Fehler-)wert "undef".
Ist mein Gedankengang falsch?
Danke, Christian
PS: Neuer Thread, da entsprechender Hinweis von einem Moderator im Ursprungsthread.
wie schon im anderen thread geschrieben:
exists und defined sind zwei unterschiedliche dinge und es gibt kein generelles besser oder schlechter. so wie bei größer und größer gleich. mal ist das eine richtig und mal das andere. in manchen konstellationen geht beides.
es kommt wirklich drauf an was du genau willst. universeller gibt es hier nicht.
im übrigen ist es genau umgekehrt. defined liefert true wenn der key vorhanden ist und der wert etwas anderes als undef ist. exists liefert true wenn es es den key gibt. auch wenn der wert undef ist.
im fall des at ist es eigentlich richtiger mit defined zu prüfen. den fall das der hash undefined enthält sollte es aber eigentlich nicht geben.
gruss
andre
Danke Andre für Deine ausführliche Antwort. Denke ich habe das verstanden. Gruß, Christian
Und sorry, dass ich dies in 2 Threads gefragt habe.
EDIT: Danke für Dein Edit jetzt ist es für mich insgesamt verständlich.
Die Lösungen mit exists bzw. defined haben bei mir nicht sauber funktioniert.
Die Lösung in diesem Thread https://forum.fhem.de/index.php?topic=13883.0 per Value funktioniert dagegen einfach und zuverlässig.
Ich denke, dass die Abfrage in 99% der Fälle nicht mehr nötig ist, wenn man defmod verwendet.
Für einen (Re)Start eines Timers ja, aber nicht für einen (vorzeitigen) Abbruch desselben.
Zumindest lese ich das so aus der defmod Spezifikation.