Warnung aus readingsBulkUpdate

Begonnen von Elektrolurch, 31 Oktober 2014, 12:26:10

Vorheriges Thema - Nächstes Thema

betateilchen

Ich würde - aus einem reinen Bauchgefühl heraus - an solch einer Stelle immer mit undef arbeiten anstatt mit delete.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

@Elektrolurch: das ist mAn perfekt geloescht, und es sollte danach auch nicht zum Problem kommen, es sei denn, dass nach dem Loeschen jemand $hash->{READINGS}{'min-Laststellung'} wieder anlegt, z.Bsp indem man $hash->{READINGS}{'min-Laststellung'}{VAL} prueft.
Falls du meinst, dass das nicht der Fall ist, und mir einen Beispiel ohne speziellen Hardware (dummy/FS20) zusammenstellst, werde ich es pruefen.

@betateilchen: Zitat "perldoc -f undef":
ZitatSaying "undef $hash{$key}" will probably not do what you expect on most predefined variables or DBM list values, so don't do that; see "delete".

betateilchen

Zitat von: rudolfkoenig am 03 November 2014, 23:45:14
@betateilchen: Zitat "perldoc -f undef":

lustig, bei "delete" steht, dass undef sogar perfomanter sei :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Klar, je weniger man tut, desto schneller ist es :)

Elektrolurch

Okay:
Zitat:
es sei denn, dass nach dem Loeschen jemand $hash->{READINGS}{'min-Laststellung'} wieder anlegt, z.Bsp indem man $hash->{READINGS}{'min-Laststellung'}{VAL} prüft...

ist das wirklich so?
defined($hash->{READINGS}{'min-Laststellung'}{VAL}) und
exists($hash->{READINGS}{'min-Laststellung'}{VAL})
legen wieder das gelöschte reading an?

Ich dachte immer, das die Abrage an dem Punkt endet, an dem der erste Teil nicht mehr definiert/existiert und wenn also 'min-Laststellung' nicht existiert, perl dann dort aufhört und nicht das reading anlegt, um dann festzustellen, das {VAL} nicht deffiniert ist.

Sollte das also tatsächlich in perl so sein, dann muss ich meinen Code mal prüfen...

Gruß

Elektrolurch
P.S.: Den Unterschied zwischen defined und exists kenne ich.
configDB und Windows befreite Zone!

rudolfkoenig

Ja, das ist wirklich so, hat mich oft gebissen.
Sonst koennte man ReadingsVal auch einfacher bauen:

sub
ReadingsVal($$$)
{
  my ($d,$n,$default) = @_;
  if(defined($defs{$d}) &&
     defined($defs{$d}{READINGS}) &&
     defined($defs{$d}{READINGS}{$n}) &&
     defined($defs{$d}{READINGS}{$n}{VAL})) {
     return $defs{$d}{READINGS}{$n}{VAL};
  }
  return $default;
}