FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: MikeR am 13 Juli 2020, 18:48:19

Titel: PERL Frage im FHEM
Beitrag von: MikeR am 13 Juli 2020, 18:48:19
Hallo,

ist vermutlich eine irre blöde Frage, ich bin aber in Perl Anfänger...
Hintergrund: Ich möchte in einer Notification-Funktion eine static Variable definieren. Grund ist, dass ich mir dort jeweils den letzten Wert der Notifikation merken will, um eine notwendige Aktion nur dann zu tätigen, wenn sich der Auslösewert auch geändert hat.

Also mache ich in dem Notify-Block (ich denke das ist ein Wrapper für eine Funktionsdefinition) sowas wie...
static $LastValue = 0
my $NewValue = ReadingsVal( 'IrgendeinObjekt', 'IrgendeinWert', '');
if( $NewValue ne $LastValue )
{
   # Mach was
}

$LastValue = $NewValue;

...und bekomme einen Fehler "Global symbol "$OldValue" requires explicit package name".

Das mit dem static habe ich aus einer Perl Doku. Aus meinen uralten C++ Kenntnissen heraus scheint das plausibel zu sein. Nur geht's halt nicht.

Ein klitzekleiner Tipp für einen Anfänger wäre echt nett!

Danke schön
Mike

Titel: Antw:PERL Frage im FHEM
Beitrag von: betateilchen am 13 Juli 2020, 19:28:30
Zitat von: MikeR am 13 Juli 2020, 18:48:19
...und bekomme einen Fehler "Global symbol "$OldValue" requires explicit package name".

naja, wenn die Variable bei Dir in Wirklichkeit "$LastValue" heißt, und Du irgendwo versuchst, auf eine nicht existierende Variable "$OldValue" zuzugreifen, ist die Fehlermeldung nicht verwunderlich.

Und das mit dem "static" mag in C++ korrekt sein, aber perl ist eine andere Sprache.
Titel: Antw:PERL Frage im FHEM
Beitrag von: MikeR am 13 Juli 2020, 20:15:15
Zitat von: betateilchen am 13 Juli 2020, 19:28:30
naja, wenn die Variable bei Dir in Wirklichkeit "$LastValue" heißt, und Du irgendwo versuchst, auf eine nicht existierende Variable "$OldValue" zuzugreifen, ist die Fehlermeldung nicht verwunderlich.

Sorry, das war ein Tippfehler hier in meinem Posting, nicht im Code/der Fehlermeldung. Da steht beides Mal "$LastValue"!

Zitat von: betateilchen am 13 Juli 2020, 19:28:30
Und das mit dem "static" mag in C++ korrekt sein, aber perl ist eine andere Sprache.

Ja, stimmt. Perl ist eine andere Sprache. Deswegen schrieb ich auch "...habe ich aus einer Perl Doku" und "...scheint das plausibel zu sein".

Wenn meine Syntax falsch ist, oder es sowas wie statische Variablen in Perl-Funktionen gar nicht gibt, wie würde den eine Lösung aussehen, um in einem notify einen neu eingetroffenen Wert mit dem Vorgängerwert zu vergleichen und ggf. die Notofikation zu verwerfen, weil schon darauf reagiert wurde?
Titel: Antw:PERL Frage im FHEM
Beitrag von: bartman121 am 13 Juli 2020, 20:31:59
https://wiki.fhem.de/wiki/Event-on-change-reading

Das im device setzen und dein notify Triggert nur noch, wenn sich der Wert ändert.
Titel: Antw:PERL Frage im FHEM
Beitrag von: betateilchen am 13 Juli 2020, 20:48:15
Zitat von: bartman121 am 13 Juli 2020, 20:31:59
Das im device setzen und dein notify Triggert nur noch, wenn sich der Wert ändert.

und was hat das mit dem Problem zu tun, um das es hier geht?
Titel: Antw:PERL Frage im FHEM
Beitrag von: betateilchen am 13 Juli 2020, 20:53:09
Zitat von: MikeR am 13 Juli 2020, 18:48:19
Also mache ich in dem Notify-Block (ich denke das ist ein Wrapper für eine Funktionsdefinition) sowas wie...

static $LastValue = 0


Wenn das also bei jeder Ausführung des notify auf 0 gesetzt wird, kannst Du Dir den Vergleich einfach sparen, weil er nie das Ergebnis liefern wird, das Du erwartest. Du hast also weniger ein Syntaxproblem, sondern eher ein Verständnisproblen, wie FHEM arbeitet und wie ein notify grundsätzlich funktioniert.

Davon abgesehen: Perl Grundlagen zu vermitteln ist nicht Aufgabe dieses Forums, dafür gibt es genügend und sehr viele Webseiten.
Titel: Antw:PERL Frage im FHEM
Beitrag von: crusader am 14 Juli 2020, 01:00:12
Zitat von: betateilchen
Wenn das also bei jeder Ausführung des notify auf 0 gesetzt wird, kannst Du Dir den Vergleich einfach sparen, weil er nie das Ergebnis liefern wird, das Du erwartest. Du hast also weniger ein Syntaxproblem, sondern eher ein Verständnisproblen, wie FHEM arbeitet und wie ein notify grundsätzlich funktioniert.

Das Verständnisproblem liegt hier wohl eher bei dir, denn der Sinn von statischen Variablen besteht ja gerade darin, dass sie nur beim ersten Aufruf initialisiert werden.
Das Keyword für statische Variablen in Perl heisst aber "state".

Es wird allerdings in einem notify-Block nix nützen, weil der Perl-Code darin keine sub des Hauptprogramms ist, sondern ein eigenständiges Programm.
Warum der angestrebte Effekt nicht mit einem "event-on-change-reading"-Attribut zu erzielen ist, verstehe ich aber nicht
(,warum harmlose Fragesteller im FHEM-Forum ständig angepflaumt werden, noch viel weniger  :-[ )
Titel: Antw:PERL Frage im FHEM
Beitrag von: MikeR am 14 Juli 2020, 10:56:41
Zitat von: crusader am 14 Juli 2020, 01:00:12
Das Verständnisproblem liegt hier wohl eher bei dir, denn der Sinn von statischen Variablen besteht ja gerade darin, dass sie nur beim ersten Aufruf initialisiert werden.

Ich wollte auch gerade erklären das eine statische Variable ja irgendwo initialisiert werden muss und die Syntax in dem Zusammenhang bedeutet, dass es nur zur Deklarationszeitpunkt passiert.

Zitat von: crusader am 14 Juli 2020, 01:00:12Das Keyword für statische Variablen in Perl heisst aber "state".

Upps, danke da hab ich wohl einen Fehler gemacht!

Zitat von: crusader am 14 Juli 2020, 01:00:12
Es wird allerdings in einem notify-Block nix nützen, weil der Perl-Code darin keine sub des Hauptprogramms ist, sondern ein eigenständiges Programm.
Warum der angestrebte Effekt nicht mit einem "event-on-change-reading"-Attribut zu erzielen ist, verstehe ich aber nicht

Ich auch nicht  :-[ Ich muss gestehen das ich das noch nicht kannte! Sorry dafür!

Zitat von: crusader am 14 Juli 2020, 01:00:12
(,warum harmlose Fragesteller im FHEM-Forum ständig angepflaumt werden, noch viel weniger  :-[ )

Ich glaube das ist noch nicht mal dem Schreiber persönlich anzukreiden. Das passiert inzwischen in fast allen Foren. Zum einen ist ja der gröbere Umgang bei einer letztendlich doch anonymen Kommunikation immer "straffrei" und zum anderen sind die höfflichen Umgangsformen unserer Altvorderen leider Geschichte. Ich fürchte da kann man kaum noch eine Gegenströmung erzeugen. Wenn man in einem Forum eine Frage stellt, muss man halt ein dickes Fell haben...

Aber zum Schluss nochmal Danke an ALLE, die sich die Mühe gemacht haben um mir bei meinem Problem zu helfen und überhaupt etwas zu schreiben...
Titel: Antw:PERL Frage im FHEM
Beitrag von: betateilchen am 14 Juli 2020, 11:13:25
Zitat von: crusader am 14 Juli 2020, 01:00:12
Es wird allerdings in einem notify-Block nix nützen, weil der Perl-Code darin keine sub des Hauptprogramms ist, sondern ein eigenständiges Programm.

das bestätigt doch genau die von mir getroffene Aussage:

Zitat von: betateilchen am 13 Juli 2020, 20:53:09
Wenn das also bei jeder Ausführung des notify auf 0 gesetzt wird,

denn der code-Block wird bei jeder Ausführung des notify als eigenständiges Programm erneut ausgeführt.

Und: ja, ich weiß (berufsbedingt), was statische Variablen sind.




Wer hat hier eigentlich wo welchen Fragesteller "angepflaumt"?
Titel: Antw:PERL Frage im FHEM
Beitrag von: fiedel am 15 Juli 2020, 06:21:32
Hier mal ein Beispiel (https://forum.fhem.de/index.php/topic,13378.msg891737.html#msg891737), welches dich weiterbringen sollte.