Hallo zusammen,
folgendes Problem: Ich verwende DOIF im Perl-Modus und möchte im Ausführungsteil einen regulären Ausdruck anwenden, wofür ich eckige Klammen benötige.
Wie werden sie escaped, so dass sie nicht von DOIF sondern von Perl interpretiert werden? Workarounds wie das Auslagern in myUtils.pm möchte ich gerne vermeiden.
Danke!
Patrick
Zitat von: PatrickR am 06 Juli 2018, 22:44:51
Hallo zusammen,
folgendes Problem: Ich verwende DOIF im Perl-Modus und möchte im Ausführungsteil einen regulären Ausdruck anwenden, wofür ich eckige Klammen benötige.
Wie werden sie escaped, so dass sie nicht von DOIF sondern von Perl interpretiert werden? Workarounds wie das Auslagern in myUtils.pm möchte ich gerne vermeiden.
Danke!
Patrick
Es gibt im DOIF eine gewisse Erkennung, ob Angaben in eckigen Klammern DOIF-Syntax darstellen oder nicht. Hast du schon etwas programmiert, was falsch erkannt wird?
Es wird demnächst einen besonderen Block im Perl-Modus geben namens def. Dieser Block wird direkt bei der Definition des DOIFs ausgeführt. Er ist dafür gedacht eigene subs zu definieren, die man nutzen kann ohne über myUtils gehen zu müssen. In diesem Block soll reine perl-Syntax erlaubt sein, ohne jegliche Ersetzungen, also ohne DOIF-Syntax in eckigen Klammern. Weiterhin wird man Timer setzen können, die nach Ablauf kein Ereignis erzeugen, auf das man triggert, sondern direkt eine Perlfunktion aufrufen, z. B. eine, die man zuvor im def-Block definiert hat.
Hallo Damian!
Zitat von: Damian am 06 Juli 2018, 23:07:02
Es gibt im DOIF eine gewisse Erkennung, ob Angaben in eckigen Klammern DOIF-Syntax darstellen oder nicht. Hast du schon etwas programmiert, was falsch erkannt wird?
Leider ja:
if (ReadingsVal("$SELF", "READINGS", "") !~ m/[^;]$reading[$;]/g) {
Das wirft Fehler, dass kein gültiger Timestamp erkannt wurde. Um ehrlich zu seine wäre mir statt der def-Implementierung ein echtes Escaping lieber.
Patrick
ja, Escaping im DOIF-Parser ist schwierig, weil es ja auch eine gültige perl-Syntax ist.
Ich werde aber die Erkennung der Timer verfeinern, denn [^;] kann z. B. kein gültiger Timer sein.