Übergabe von Zeichenketten mit Leerzeichen an get-Befehle

Begonnen von tupol, 16 April 2016, 10:35:36

Vorheriges Thema - Nächstes Thema

Loredo

Ok, alles klar.


Zitat von: rudolfkoenig am 15 Mai 2016, 14:57:40
By modify existiert ein $hash->{OLDDEF}


Thnx, again what learned  ;D


Hab mir jetzt erstmal so beholfen:




    if ( $hash->{OLDDEF} && ( !defined( @$a[1] ) || @$a[1] ne "ONKYO_AVR" ) ) {
        unshift @$a, @$a[0];
        @$a[1] = "ONKYO_AVR";
    }
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

justme1968

so sollte es wieder passen.

Index: fhem.pl
===================================================================
--- fhem.pl (revision 11443)
+++ fhem.pl (working copy)
@@ -1802,8 +1802,9 @@
   $hash->{OLDDEF} = $hash->{DEF};
   $hash->{DEF} = $a[1];
   my $ret = CallFn($a[0], "DefFn", $hash,
-                    $modules{$hash->{TYPE}}->{parseParams} ? parseParams($def) :
-                      "$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : ""));
+                    $modules{$hash->{TYPE}}->{parseParams}
+                      ? parseParams("$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : ""))
+                      : "$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : ""));
   if($ret) {
     $hash->{DEF} = $hash->{OLDDEF};
   } else {


etwas wie unshift um direkt im aufruf $hash->{TYPE} an den anfang von $def zu hängen wäre zwar schöner aber ich habe keine idee ob und wie man das ohne temporäre variable verwenden kann.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig


rudolfkoenig

Aus aktuellen Anlass habe ich perlSyntaxCheck wieder getestet, und dabei ist mir aufgefallen, dass folgender String akzeptiert wird:
{ $defs{$k}{MSGCNT}=0 } }
Nach etwas debugging: parseParams($exec, ';') aufgerufen aus perlSyntaxCheck liefert ein leeres Array zurueck.
Andre: kannst du bitte danach schauen?

Ich habe erstmal einen Workaround in perlSyntaxCheck eingebaut.

justme1968

mit der folgenden änderung wird es korrekt als (falscher) perl ausdruck erkannt:Index: fhem.pl
===================================================================
--- fhem.pl (revision 13496)
+++ fhem.pl (working copy)
@@ -4844,6 +4844,9 @@
     if( !defined( $value ) ) {
       $value = $key;
       $key = undef;
+    } elsif( $key =~ m/^\s*{/ ) { # the key can not start with a { -> it must be a perl expression
+      $value = "$key = $value";
+      $key = undef;
     }

     #collect all parts until the closing ' or "
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig


rudolfkoenig

Ist immer noch madig:
{ fhem "set alarm off" if($mday==9 && $month==9) }
meldet
syntax error at (eval 36) line 1, near "= ="
weil parseParams daraus:
{ fhem "set alarm off" if($mday = =9 && $month==9) }
macht.

justme1968

war natürlich blödsinn den gesplitteten parameter von hand wieder zusammen zu setzen statt gleich das original zu verwenden...

so geht es:--- fhem.pl (revision 13496)
+++ fhem.pl (working copy)
@@ -4844,6 +4844,9 @@
     if( !defined( $value ) ) {
       $value = $kIndex: fhem.pl
===================================================================
--- fhem.pl (revision 13500)
+++ fhem.pl (working copy)
@@ -4851,7 +4851,7 @@

     # the key can not start with a { -> it must be a perl expression
     } elsif( $key =~ m/^\s*{/ ) {
-      $value = "$key = $value";
+      $value = $param;
       $key = undef;
     }
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig


justme1968

@rudi: da ich nicht weiss ob du das hier: https://forum.fhem.de/index.php/topic,68517.msg599846.html#msg599846 gesehen hast...

mit dem folgenden patch wird das behoben. hilft auch gleich gegen tabs vor dem öffnenden {.

Index: fhem.pl
===================================================================
--- fhem.pl (revision 13580)
+++ fhem.pl (working copy)
@@ -4871,7 +4871,7 @@
     }

     #collect all parts until opening { and closing } are matched
-    if( $value =~ m/^{/ ) { # } for match
+    if( $value =~ m/^\s*{/ ) { # } for match
       my $count = 0;
       for my $i (0..length($value)-1) {
         my $c = substr($value, $i, 1);
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig


justme1968

@rudi: mein patch oben behebt nur den fehler beim parsen mit parseParams. damit es auch zur laufzeit geht muss vermutlich mindestens das hier:Index: fhem.pl
===================================================================
--- fhem.pl (revision 13580)
+++ fhem.pl (working copy)
@@ -1045,7 +1045,7 @@
   Log 5, "Cmd: >$cmd<";
   return undef if(!$cmd);

-  if($cmd =~ m/^{.*}$/s) {              # Perl code
+  if($cmd =~ m/^\s*{.*}$/s) {              # Perl code
     return AnalyzePerlCommand($cl, $cmd, 1);
   }


auch noch geändert werden. das gleiche in SemicolonEscape. und ReplaceEventMap. kann es aber gerade nicht selber testen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig


justme1968

#43
ok... weil du es bist :)

AnalyzeCommand, SemicolonEscape und ReplaceEventMap können bleiben wie sie sind aber wenn man im notify die öffnende { nicht nur in der ersten sondern auch in der zweiten zeile erlauben will muss man das splitten im define z.b. so ändern:Index: 91_notify.pm
===================================================================
--- 91_notify.pm (revision 13580)
+++ 91_notify.pm (working copy)
@@ -28,7 +28,7 @@
notify_Define($$)
{
   my ($hash, $def) = @_;
-  my ($name, $type, $re, $command) = split("[ \t]+", $def, 4);
+  my ($name, $type, $re, $command) = split("[ \t\n]+", $def, 4);

   if(!$command) {
     if($hash->{OLDDEF}) { # Called from modify, where command is optional


für at gilt vermutlich ähnliches.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Bin nicht sicher, ob ich diese Syntax fuer gut finde, habe aber nicht genug Argumente dagegen, habs also eingecheckt.