FHEM Forum

FHEM => Sonstiges => Thema gestartet von: klaus.schauer am 19 März 2013, 20:56:54

Titel: Perl Fehlermeldung
Beitrag von: klaus.schauer am 19 März 2013, 20:56:54
Folgende Prgrammzeile

push @event, "3:state:" . $db_0 & 1 ? "on" : "off";      

liefert an einer Stelle im Programm die Fehlermeldung

Argument "3:state:9" isn't numeric in bitwise and (&) at ./FHEM/10_EnOcean.pm line 1374.

Falls ich statt dessen

push @event, "3:state:" . ($db_0 & 0x01 ? "on" : "off");

verwende, ist der Fehler weg. Nach meiner Auffassung sind die beiden Programmzeilen gleichwertig. Ich habe an anderen Stellen mehrfach die erste Variante genutzt. Dort wird kein Fehler generiert. Wenn ich die Variable $db_0 ausgebe, wird der nummerische Wert "9" angezeigt?!

Mache ich einen Denkfehler? Gibt es da einen Trick oder führt die Fehlermeldung in die Irre?
Titel: Aw: Perl Fehlermeldung
Beitrag von: decaflo am 27 März 2013, 15:44:33
ZitatNach meiner Auffassung sind die beiden Programmzeilen gleichwertig
Sind sie aber nicht. Die Konkatenation "3:state:" . $db_0 hat Priorität gegenüber dem folgenden &. (siehe z.B. http://de.selfhtml.org/perl/sprache/operatoren.htm (//de.selfhtml.org/perl/sprache/operatoren.htm))
Daher wird in
push @event, "3:state:" . $db_0 & 1 ? "on" : "off";
"3:state:9" & 1 ausgewertet. Das führt zum Fehler. Die Klammerung verändert die Rangfolge der Operatoren.

Gruss, Florian
Titel: Aw: Perl Fehlermeldung
Beitrag von: klaus.schauer am 27 März 2013, 16:19:09
Danke für den Tipp und danke für die Referenz. Dort ist die Operatorenrangfolge gut beschrieben.