[gelöst] Escape von } im perl-Modus

Begonnen von GammaTwin, 21 Februar 2021, 12:15:29

Vorheriges Thema - Nächstes Thema

GammaTwin

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?

TomLee

#1
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

Christoph Morrison

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 versuchen um die Klammer zu maskieren.

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GammaTwin

@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.