Wie schiesse ich mir am besten in den Fuß? (undef kann man nicht vergleichen)

Begonnen von RichardCZ, 15 April 2020, 15:25:14

Vorheriges Thema - Nächstes Thema

RichardCZ

Zur Auflockerung: http://www.toodarkpark.org/computers/humor/shoot-self-in-foot.html
(Der Perl Eintrag hat's in sich  ;) )

https://forum.fhem.de/index.php/topic,93664.msg1042617.html#msg1042617
wollte mal nachsehen ob noch andere in die Falle getappt sind. Natürlich.

FHEM/88_Timer.pm:                && AttrVal( $FW_wname, "confirmDelete", undef ) == 0 )
FHEM/10_UNIRoll.pm:        && AttrVal( $name, "useRolloPos", undef ) == 1 );
FHEM/31_HUEDevice.pm:                || AttrVal( $name, "model", undef ) eq 'LLC020'
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "temperatureRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointTempRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "humidityRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "observeRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "demandRespRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "temperatureRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointTempRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "humidityRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "observeRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "demandRespRefDev", undef ) eq $1 ) {
FHEM/98_vitoconnect.pm:                    || AttrVal( $name, 'vitoconnect_raw_readings', undef ) eq
FHEM/98_vitoconnect.pm:            if ( AttrVal( $name, 'vitoconnect_actions_active', undef ) eq "1" )
FHEM/98_TRAFFIC.pm:            && AttrVal( $name, "includeReturn", undef ) eq 1 )


Der Sinn des 3. Parameters in AttrVal ist es, einen vernünftigen Default zurückzuliefern. Macht davon bitte Gebrauch.
Falls "undef" vernünftig ist, dann darf man das aber nicht unbedarft auf einen Vergleichsoperator loslassen.

Gern geschehen.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

klaus.schauer

Und wie ist das werte Ergebnis, wenn man sich das im Gesamtkontext ansieht?

      if (defined AttrVal($name, "temperatureRefDev", undef)) {
        if (AttrVal($name, "temperatureRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name temperatureRefDev");
        }
      } elsif (defined AttrVal($name, "setpointRefDev", undef)) {
        if (AttrVal($name, "setpointRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name setpointRefDev");
        }
      } elsif (defined AttrVal($name, "setpointTempRefDev", undef)) {
        if (AttrVal($name, "setpointTempRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name setpointTempRefDev");
        }
      } elsif (defined AttrVal($name, "humidityRefDev", undef)) {
        if (AttrVal($name, "humidityRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name humidityRefDev");
        }
      } elsif (defined AttrVal($name, "observeRefDev", undef)) {
        if (AttrVal($name, "observeRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name observeRefDev");
        }
      } elsif (defined AttrVal($name, "demandRespRefDev", undef)) {
        if (AttrVal($name, "demandRespRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name demandRespRefDev");
        }

RichardCZ

Zitat von: klaus.schauer am 15 April 2020, 16:31:26
Und wie ist das werte Ergebnis, wenn man sich das im Gesamtkontext ansieht?

Kapitalintensiv.

Ich rufe also eine Funktion auf, der ich "undef" als gewünschten Rückgabe-Default mitgebe.
Dann teste ich, ob dieser "undef" Wert zurück kam.
Wenn nein, ... rufe ich die Funktion nochmal auf (gleiche Parameter) und vergleiche das Ergebnis mit einem Rx-match
Wenn das übereinstimmt - mache ich was.

Ja, ich habe mir einen Schutz vor der undef-Warnung hart erarbeitet.

Noch ein wenig mehr Kontext und man sieht:

elsif ( $devName eq "global" && $s =~ m/^RENAMED ([^ ]*) ([^ ]*)$/ ) {

Ergo $1 soll nie nimmer "Leerzeichen" sein. Also nehmen wir doch genau das als Default
und sparen uns den ganzen Regentanz:

elsif ( $devName eq "global" && $s =~ m/^RENAMED ([^ ]*) ([^ ]*)$/ ) {
    if ( AttrVal( $name, "temperatureRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name temperatureRefDev $2" );
    }
    elsif ( AttrVal( $name, "setpointRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name setpointRefDev $2" );
    }
    elsif ( AttrVal( $name, "setpointTempRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name setpointTempRefDev $2" );
    }
    elsif ( AttrVal( $name, "humidityRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name humidityRefDev $2" );
    }
    elsif ( AttrVal( $name, "observeRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name observeRefDev $2" );
    }
    elsif ( AttrVal( $name, "demandRespRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name demandRespRefDev $2" );
    }


Und so wäre EnOcean (in diesem Fall) auch nie prominent im grep gelandet.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

justme1968

wenn zu sehen ist das im grep nicht das ganze konstrukt geliefert wurde sollte man sich vor der bitte um beifall die mühe machen den kontext anzuschauen. sonst kann es passieren das man mit seinem hinweis unrecht hat weil man übersieht das der undef teil schon vorher abgehandelt wurde und alle füße noch unverletzt sind und bleiben.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

RichardCZ

Zitat von: justme1968 am 16 April 2020, 10:39:00
wenn zu sehen ist das im grep nicht das ganze konstrukt geliefert wurde sollte man sich vor der bitte um beifall die mühe machen den kontext anzuschauen. sonst kann es passieren das man mit seinem hinweis unrecht hat weil man übersieht das der undef teil schon vorher abgehandelt wurde und alle füße noch unverletzt sind und bleiben.

Jaja justme1968 - is' scho' recht.

Der ganze FHEM code ist generell unfehlbar. Wie konnte ich das nur vergessen?

Schon mal ein Baby in vollgeschissener Windel gesehen, was laut schreiend seine gegenwärtige Situation verteidigt? Nein? Nur damit Du in etwa eine Vorstellung davon bekommst was für ein Anblick sich mir gerade geboten hat.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

justme1968

ich weiß ja nicht was du falsch gemacht hast, aber meine kinder haben sich nie gegen das windelwechseln gewehrt.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Martin Fischer

Könnten sich alle Beteiligte bitte wieder auf die Inhalte konzentrieren und etwaige (hinkende und unnötige) Vergleiche aussen vor lassen?

DANKE!
--
Admin, Developer, Gründungsmitglied des FHEM e.V.