readingList perl-Expression anonyme Hashreferenz curly braces optional

Begonnen von TomLee, 25 März 2025, 18:37:28

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

eine Frage dazu, weil mir heute das Handling mit Hashreferenzen etwas klarer wurde.

ZitatreadingList <regexp> [readingName|perl-Expression] ...
If the regexp matches topic:message or cid:topic:message either set readingName to the published message, or evaluate the perl expression, which has to return a hash consisting of readingName=>readingValue entries. You can define multiple such tuples, separated by newline, the newline does not have to be entered in the FHEMWEB frontend. cid is the client-id of the sending device.
Example:
  attr dev readingList\
    myDev/temp:.* temperature\
    myDev/hum:.* { { humidity=>$EVTPART0 } }

{ humidity=>$EVTPART0 }ist nach meinem jetzigen Verständnis eine anonyme Hashreferenz

So soll man sie angeben im rl-Attribut im Perl-Ausdruck:
myDev/hum:.* { { humidity=>$EVTPART0 } }Mir ist schon öfter aufgefallen das man die geschweiften Klammer auch weglassen kann:
myDev/hum:.* { humidity=>$EVTPART0 }
Woran erkennt Perl dann immer noch das es eine anonyme Hashreferenz ist?
Alleine an dem =>?

Gruß Thomas

frober

Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

Moin,

ich les da nix davon, warum man die geschweiften auch weglassen kann?

frober

Das mit dem Weglassen steht da nicht, aber dass das '=>' zum Deklarieren eines Hashes verwenden wird.

...und Klammern sind ja oft optional und können weggelassen werden.

Bin aber kein Profi wie du weißt ;D
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

Ich meine jetzt, es ist eine Liste, die da zurückgegeben wird, ohne curlys.

Man kann auch einfach ein normales Komma nehmen (das muss net fett sein):


tzi:.* {'bla','on','bli','off'}

Es muss gar keine Referenz auf einen Hash zurückgegeben werden?

betateilchen

Man kann einen hash in perl eben auf mehrere Arten definieren.

In perl ist ein hash nichts weiter als eine Liste mit einer geraden Anzahl von Elementen.
Die Art und Weise, wie perl mit solchen Listen umgeht, ist Fluch und Segen zugleich.

{'bla','on','bli','off'}
wird solange fehlerfrei als hash akzeptiert, solange die Anzahl der Elemente gerade ist.
Ansonsten gibt es eine Fehlermeldung bezüglich "Odd number of elements ind hash assignment".

Das alles hat aber erstmal nichts speziell mit MQTT zu tun, vielleicht wäre eine der Perl Ecken hier im Forum besser dafür geeignet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Danke. Hat mir schon mehr weitergeholfen.

Klar ist aber noch lange nicht alles...



betateilchen

Zitat von: TomLee am 26 März 2025, 20:42:35Danke. Hat mir schon mehr weitergeholfen.
Klar ist aber noch lange nicht alles...

Zum Weiterlesen: https://perldoc.perl.org/perldata

Ein ganz wichtiger Satz auf dieser Seite ist der hier:

ZitatPerl has three built-in data types: scalars, arrays of scalars, and associative arrays of scalars, known as "hashes".

Wenn man sich das verinnerlicht, hat man gute Chancen, sich alles an Daten und Strukturen zusammenzubauen, was immer man haben möchte.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frober

Zitat von: TomLee am 25 März 2025, 18:37:28{ humidity=>$EVTPART0 }ist nach meinem jetzigen Verständnis eine anonyme Hashreferenz

Ich musste auch erst nachlesen...

Es gibt keine anonyme Hashreferenz.
Es gibt einen anonymen Hash und
eine Referenz auf einen anonymen Hash.

Wäre die Referenz anonym, könntest du sie nicht verwenden, da sie "unbekannt" ist.


Bzgl. Komma vs. fettes Komma:
https://perldoc.perl.org/perlop#Comma-Operator
Hilft vielleicht zum Verständnis.

Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

frober

Bzgl. Verwendung doppelter oder einfacher  Klammern

Die äußeren Klammern sind ja "nur" für FHEM, damit es weiß das nun Perl angewendet wird.

Zitat aus dem PDF "perl_skript.pdf" Punkt 2.7, was du mir gesendet hattest.
ZitatIn vielen Fällen wird der Compiler auch ohne Klammern oder Pfeile einfach das interpretieren, von dem er meint, dass es wohl beabsichtigt war– in anderen Fällen wird er die Kompilierung mit einer Fehlermeldung abbrechen. Klammern zu setzen bzw. Pfeile zu benutzen vermeidet in jedem Fall mögliche Interpretationsprobleme.

Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

frober

Frage an die Spezialisten:

Ist es richtig interpretiert, dass
myDev/hum:.* { { humidity=>$EVTPART0 } }
folgendes bedeutet?
myDev/hum:.* { $_ = { humidity=>$EVTPART0 } }
D.h. Fhem bekommt mit der Referenz $_ das Reading und den Wert mitgeteilt!?
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

ZitatDie äußeren Klammern sind ja "nur" für FHEM, damit es weiß das nun Perl angewendet wird.

Der Beitrag ging an mir vorbei.

Könnte man auch so lesen als ob mir der "Urschleim"  ;D  nicht bewusst wäre. Dem ist nicht so.

Wenn wer in diesem Kontext dein Zitat versteht, dann ist auch diese Aussage klar:

ZitatDie Art und Weise, wie perl mit solchen Listen umgeht, ist Fluch und Segen zugleich.

(Hoffe wir reden jetzt nicht alle aneinander vorbei)