FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: GammaTwin am 21 Februar 2021, 12:15:29

Titel: [gelöst] Escape von } im perl-Modus
Beitrag von: GammaTwin am 21 Februar 2021, 12:15:29
Grüße,

ich möchte folgende if-Abfrage im Perl-Modus verwenden. Dabei soll geprüft werden, ob das letzte Zeichen in "$Row" ein "}" ist.
if ($Row =~ /(\})$/) {$iContent_Start=$iContent;};

Ich erhalte den Fehler
right bracket without left bracket

Im Forum habe ich zum escapen die Varianten "\}" und "[}]" gefunden. Beides funktioniert nicht.

Liegt es überhaupt am Escape? oder wie muss ich das im DOIF im Perl-Modus schreiben?
Titel: Antw:Escape von } im perl-Modus
Beitrag von: TomLee am 21 Februar 2021, 13:09:58
Nur so als Idee, keine Ahnung obs auch kürzer geht.

Erstmal das letzte Zeichen ermitteln und dann abfragen ob es eine } ist ?

{my $Row ="bla}";;$Row=~ /(.{1}$)/;;if ($1 eq "}") {return "bla"}}

Gruß

Thomas
Titel: Antw:Escape von } im perl-Modus
Beitrag von: Christoph Morrison am 21 Februar 2021, 13:55:42
Ich glaube ich hatte so ein Problem auch mal in den userReadings mit einer bestimmten Konstellation aus geschweiften Klammern. Ich habe damals vermutet, dass es am FHEM-Perl-Preparser liegt, aber habe es dann irgendwie umgangen weil ich keinen soliden Bug-Report hinbekommen habe.

Ansonsten vielleicht mal mit chr (https://perldoc.perl.org/functions/chr) versuchen um die Klammer zu maskieren.
Titel: Antw:Escape von } im perl-Modus
Beitrag von: Damian am 21 Februar 2021, 14:46:58
Im DOIF-Perlmodus kann man solche Probleme umgehen, indem man den Code in eine Routine auslagert. Im subs-Block finden keine DOIF-Ersetzungen statt, dort herrscht reines Perl.
Titel: Antw:Escape von } im perl-Modus
Beitrag von: GammaTwin am 21 Februar 2021, 19:03:00
@TomLee,
in Deiner Zeile steht ja auch die Klammer "}" und damit taucht der Fehler auf. Aber die Idee habe ich benutzt.

@Christoph Morrison,
Die chr-Idee in TomLees Vorschlag eingebaut, funktioniert. Die Lösung sieht dann so aus:
{my $chrBRACKET=chr(125); $Row =~ /(.{1})$/; if ($1 eq $chrBRACKET) {$iContent_Start=$iContent;};};

@Damian,
Der Hinweis auf die DOIF-Ersetzungen und die chr-Variante brachten mich auf die Idee hex in die regex einzubauen. Das Zeichen ist dann ja nicht da. Diese Zeile funktioniert auch:
if ($Row =~ /(\x7D)$/) {$iContent_Start=$iContent;};

Danke für Antworten

PS: Das mit den subs muss ich mir mal anschauen.