Verständnisfrage zu: my $var

Begonnen von M_I_B, 27 Mai 2016, 09:59:51

Vorheriges Thema - Nächstes Thema

M_I_B

Hallo liebe Leute,

ich habe u.a. mal folgendes gebosselt:
define sunSET at *00:00 { \
my $s = sunrise_abs("REAL");; fhem("set SunUP_r $s");;my $s = sunset_abs("REAL");; fhem("set SunDN_r $s");;\
my $s = sunrise_abs("CIVIL");; fhem("set SunUP_c $s");;my $s = sunset_abs("CIVIL");; fhem("set SunDN_c $s");;\
my $s = sunrise_abs("NAUTIC");; fhem("set SunUP_n $s");;my $s = sunset_abs("NAUTIC");; fhem("set SunDN_n $s");;\
my $s = sunrise_abs("ASTRONOMIC");; fhem("set SunUP_a $s");;my $s = sunset_abs("ASTRONOMIC");; fhem("set SunDN_a $s");;\
}

Das funktioniert zwar schmerzfrei, was die Zuordnung der Werte betrifft, aber im fhem.log rappelt es natürlich Fehlermelungen like:
Zitat2016.05.27 00:00:00.003 1: PERL WARNING: "my" variable $s masks earlier declaration in same scope at (eval 25011) line 2.
2016.05.27 00:00:00.004 1: PERL WARNING: "my" variable $s masks earlier declaration in same scope at (eval 25011) line 3.
2016.05.27 00:00:00.006 1: PERL WARNING: "my" variable $s masks earlier declaration in same scope at (eval 25011) line 4.
2016.05.27 00:00:00.007 1: PERL WARNING: "my" variable $s masks earlier declaration in same scope at (eval 25011) line 5.

Daraus ergeben sich für mich zwei Fragen...

1. Wie macht man es richtig und sauber?

2. Muss ich denn auf eine Variable als Zwischenspeicher in FHEM zurückgreifen? Kann ich das nicht ganz schnöde direkt machen wie z.B.:
fhem("set SunUP_r sunrise_abs("REAL")");;

justme1968

#1
- nur ein einziges mal my am anfang und dann die variable immer wieder verwenden

- lernen das es unterschiedliche anführungszeichen gibt und ach die möglichkeit diese zu maskieren, hier musst du aber sowieso strings aneinander hängen und die anführungszeichen sind gar nicht verschachtelt.
fhem("set SunUP_r ". sunrise_abs('REAL'));

- mehr perl grundlagen lernen

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

M_I_B

Zitat von: justme1968 am 27 Mai 2016, 10:06:15
- nur ein einziges mal my am anfang und dann die variable immer wieder verwenden
Ok, das ist einfach; typisches "Wald vor lauter Bäumen nicht gesehen" Problem :o

Zitat von: justme1968 am 27 Mai 2016, 10:06:15
- lernen das es unterschiedliche anführungszeichen gibt und ach die möglichkeit diese zu maskieren:
Ha! Das wusste ich schon ;) Ich habe das hier lediglich als Beispiel per Copy&Past aus dem o.g. Code genommen und nicht weiter auf die korrekte Maskierung geachtet...
Heißt aber, wenn ich Dich richtig verstanden habe, das die Version ohne Zwischenschritt über die Variable ebenfalls funktionieren würde? Ist das bezgl. Laufzeitverhalten denn besser?

Zitat von: justme1968 am 27 Mai 2016, 10:06:15
- mehr perl grundlagen lernen
... schon richtig ... Fällt mir aber schwer... Ich habe zwei Assembler, Pascal, Bascom und PHP so halbwegs auf'm Schirm. Gerade mit letztgenanntem wirbel ich Perl immer durcheinander und such mir dann'n Wolf; sowas is für'n alten Mann nicht mehr so einfach ;)

Ansonsten danke ich Dir für die schnelle Antwort und Klärung!

justme1968

ZitatHeißt aber, wenn ich Dich richtig verstanden habe, das die Version ohne Zwischenschritt über die Variable ebenfalls funktionieren würde?
ja.

ZitatIst das bezgl. Laufzeitverhalten denn besser?
wenn der parser/interpreter/compiler vernünftig implementiert ist sollte es keinen unterschied machen. und selbst wenn es einen gibt ist der so unmerkbar das die lesbarerer version die bessere ist.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

M_I_B

... ja super! Wenn das auch direkt funktioniert und m.E. die direkte Zuweisung lesbarer ist und auch noch keinen Unterschied macht bezgl. Laufzeit, dann ist die Entscheidung für die direkte Zuweisung ja fast zwingend  8)

Dank Deiner Hilfe wieder was gelernt...

M_I_B

... irgendwas hat heute Nacht geklemmt  :o

Seit den genannten Fragen und Antworten sind ja schon einige Tage vergangen. In der Zeit hat das super funktioniert. Die einzelnen Werte zu Sonnenauf- und Untergang wurden brav jeweils um Mitternacht in die Dummys gelegt, womit ich dann an anderer Stelle weiter arbeiten konnte.
Eben aber fand ich im fhem.log für heute Nacht folgende Fehlermeldungen:
2016.06.12 00:00:00.013 1: PERL WARNING: Argument "21:37:32" isn't numeric in subtraction (-) at (eval 39268) line 1.
2016.06.12 00:00:00.014 1: PERL WARNING: Argument "05:03:36" isn't numeric in subtraction (-) at (eval 39268) line 1.
2016.06.12 00:00:00.042 1: PERL WARNING: Argument "21:38:09" isn't numeric in subtraction (-) at (eval 39271) line 1.
2016.06.12 00:00:00.043 1: PERL WARNING: Argument "05:03:36" isn't numeric in subtraction (-) at (eval 39271) line 1.

Entgegen meiner Erwartung sind aber die Zeiten korrekt in den Dummys angekommen, wie man hier sehen kann:
Sonnenaufgang ____REAL 05:03:36
Sonnenuntergang __REAL 21:38:09
Sonnenaufgang ___CIVIL 04:06:03
Sonnenuntergang _CIVIL 22:35:51
Sonnenaufgang __NAUTIC 02:42:53
Sonnenuntergang NAUTIC 23:59:33
Sonnenaufgang ___ASTRO 01:20:38
Sonnenuntergang _ASTRO 25:20:51

Der Vollständigkeit halber hier noch mal das ganze Konstrukt:
### Sonnenauf- und Untergang ###
define SunUPr dummy
attr SunUPr alias Sonnenaufgang ____REAL
attr SunUPr room Umwelt
attr SunUPr sortby 01
define SunUPc dummy
attr SunUPc alias Sonnenaufgang ___CIVIL
attr SunUPc room Umwelt
attr SunUPc sortby 03
define SunUPn dummy
attr SunUPn alias Sonnenaufgang __NAUTIC
attr SunUPn room Umwelt
attr SunUPn sortby 05
define SunUPa dummy
attr SunUPa alias Sonnenaufgang ___ASTRO
attr SunUPa room Umwelt
attr SunUPa sortby 07

define SunDNr dummy
attr SunDNr alias Sonnenuntergang __REAL
attr SunDNr room Umwelt
attr SunDNr sortby 02
define SunDNc dummy
attr SunDNc alias Sonnenuntergang _CIVIL
attr SunDNc room Umwelt
attr SunDNc sortby 04
define SunDNn dummy
attr SunDNn alias Sonnenuntergang NAUTIC
attr SunDNn room Umwelt
attr SunDNn sortby 06
define SunDNa dummy
attr SunDNa alias Sonnenuntergang _ASTRO
attr SunDNa room Umwelt
attr SunDNa sortby 08

define sunSET at *00:00 { \
fhem("set SunUPr ". sunrise_abs('REAL'));; fhem("set SunDNr ". sunset_abs('REAL'));;\
fhem("set SunUPc ". sunrise_abs('CIVIL'));; fhem("set SunDNc ". sunset_abs('CIVIL'));;\
fhem("set SunUPn ". sunrise_abs('NAUTIC'));; fhem("set SunDNn ". sunset_abs('NAUTIC'));;\
fhem("set SunUPa ". sunrise_abs('ASTRONOMIC'));; fhem("set SunDNa ". sunset_abs('ASTRONOMIC'));;\
}


Wie gesagt hat das bis heute Nach ohne Fehlermeldungen funktioniert. Habe extra mal das ganze Logfile durchsucht...

... was'n dat nu schon wieder?

justme1968

stacktrace einschalten und schauen woher die meldung genau kommt.

wahrscheinlich ist es nicht das erzeugen der readings sondern das weiterverarbeiten irgendwo.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

M_I_B

Zitatsondern das weiterverarbeiten irgendwo.
... auch wenn die Weiterverarbeitung das erste mal viel später geschieht? Die erste AKtion, in der die Dummy-Werte genutzt werden, ist erst am Morgen bei jeweils der Zeit von sunrise_abs('REAL') ...

Zitatstacktrace einschalten und schauen woher die meldung genau kommt.
... HowTo ? Stacktrace kenne ich nur vom Atmel- Debugger und da ist es nur ein Klick ;)

justme1968

stacktrace attribut von global. siehe commandref.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

M_I_B

#9
... das ging flott ! Danke. Dann schalte ich das mal ein und melde mich wieder, wenn da was kommt ...

EDIT sagt, das ich an Alzheimer leide; doch vergessen, StackTrace einzuschalten  :o >:(
Ich stelle mir jetzt den SmartPhone-Wecker mit Nachricht, klebe mir ein Hafti an'n Monitor und mach mir'n Knoten in das virtuelle Taschentuch...

Der Fehler von Gestern ist heute nicht aufgetaucht, dafür aber was neues:
2016.06.13 00:00:01.776 1: PERL WARNING: Use of uninitialized value $sendVal in uc at ./FHEM/10_IT.pm line 299.
2016.06.13 02:00:01.770 1: PERL WARNING: Use of uninitialized value $sendVal in uc at ./FHEM/10_IT.pm line 303.

Aber das hat ja wohl nichts mit HM- Komponenten zu tun und soll nur der Vollständigkeit halber erwähnt werden. An IT- Kram habe ich gestern Abend noch rumgefrickelt und sicherlich irgendwo einen Typo drin...