Autor Thema: Übergabe von Zeichenketten mit Leerzeichen an get-Befehle  (Gelesen 3756 mal)

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17003
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #15 am: 16 April 2016, 22:15:40 »
na das war schnell :)

hier ist der zweite teil. damit kann ein modul in Initialize $hash->{parseCmds} auf 1 setzen, dann wird DefFn, SetFn und GetFn nicht mehr mit dem string bzw. dem gesplittete string aufgerufen sondern mit array ref und hash ref aus dem parseParams ergebnis. für module die parseCmds nicht gesetzt haben bleibt alles beim alten.

um das so einfach wie möglich einzubauen kann man parseParams jetzt entweder mit dem string (für DefFn) und mit einer array ref (für SetFn und GetFn) aufrufen.

wo sollte man die routine, deren automatisch und manuelle verwendung sowie die erlaubte syntax dokumentieren?


wie im anderen thread schon geschrieben könnte man den aufruf auch zusammen mit dem perlSyntaxCheck verwenden und erst alles durch parseParams schicken und dann jeden {...} teil einzeln durch perlSyntaxCheck. offen wäre ob man das zentral in perlSyntaxCheck einbaut oder  ob jeder aufrufen von perlSyntaxCheck dafür selber zuständig ist.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17423
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #16 am: 17 April 2016, 12:07:18 »
Habe deinen Patch eingecheckt, nur den $hash-Eintrag von parseCmds nach parseParams geaendert.

Zitat
könnte man den aufruf auch zusammen mit dem perlSyntaxCheck verwenden und erst alles durch parseParams schicken und dann jeden {...} teil einzeln durch perlSyntaxCheck.
Verstehe ich nicht:
fhem> { use Data::Dumper;; Dumper parseParams("{ a;;b };;c;;{ d;;e }") }
$VAR1 = [
          '{ a;b };c;{ d;e }'
        ];
$VAR2 = {};

parseParams zerlegt mir doch die Befehlszeile nicht in Einzelteile. Und wenn nicht: wobei hilft sie mir?

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17003
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #17 am: 17 April 2016, 13:00:35 »
dazu muss man natürlich dann an ; splitten. nicht am leerzeichen. z.b. in dem man das trennzeichen optional mit übergibt:{ use Data::Dumper;; Dumper parseParams("{ a;;b };;c;;{ d;;e }", ';;') }
$VAR1 = [
          '{ a;b }',
          'c',
          '{ d;e }'
        ];
$VAR2 = {};

FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17423
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #18 am: 17 April 2016, 13:12:58 »
Sehe ich falsch, oder muss das noch implementiert werden?
Dann muesste ich auch die Deklaration (sub parseParams($)) anpassen.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17003
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #19 am: 17 April 2016, 13:14:01 »
der patch der dran hängt macht genau das. :)

ps: man muss dann in perlSyntaxCheck auf ^\s?{.*}\s?$ prüfen da die leerzeichen nicht mehr getrimmt werden.
« Letzte Änderung: 17 April 2016, 13:28:00 von justme1968 »
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17423
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #20 am: 17 April 2016, 13:36:37 »
Sorry, war nicht aufmerksam.
Hab dein Patch eingespielt, parseParams ans Ende von fhem.pl verschoben, und sie in perlSyntaxCheck aufgerufen.

Offline tupol

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1258
  • Support gibt es nur im Forum
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #21 am: 17 April 2016, 17:12:50 »
Vielen Dank für die schnelle Reaktion. Finde ich echt super, wie schnell das Problem gelöst wurde.

@justme1968
Also ich habe das jetzt folgendermaßen verbaut:
my ($a, $h) = parseParams( join (" ", @val) );
@val = @$a;

Wäre es vielleicht auch möglich, das ganze so zu realisieren, das bereits ein
@val = parseParams @val;zum Erfolg führt?
« Letzte Änderung: 17 April 2016, 17:23:48 von tupol »
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwicklung: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17003
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #22 am: 17 April 2016, 17:25:39 »
du kannst statt dem string inzwischen (ab morgen) auch eine ref auf das gesplittete array übergeben. d.h. das join kann entfallen:my ($a, $h) = parseParams( \@val );
die zuweisung zum dereferenzieren der rückgabe könnte man vielleicht auch noch weg bekommen aber eigentlich ist das doch ein sonderfall da es effizienter ist das array nicht noch mal zu kopieren.

gruss
  andre
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline tupol

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1258
  • Support gibt es nur im Forum
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #23 am: 17 April 2016, 17:30:39 »
Danke.
Die 2. Zeile ist aber eher Faulheit, da ich so den Code nicht ändern muss und Faulheit ist bei mir beim Coden eher kein Sonderfall.  ;D
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwicklung: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

Offline tupol

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1258
  • Support gibt es nur im Forum
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #24 am: 17 April 2016, 17:36:16 »
So mal schnell gegrübelt. Die Sache mit dem = ist ja eine Superidee. Ich habe das bisher mit "say:" gelöst.

Aber könnte es nicht sein, dass Module die Parameter in einer bestimmten Reihenfolge erwarten und der Hash, dann alles durcheinanderbringt? Vielleicht in den ersten @a alles packen und hinter %h noch den aktuellen @a packen?
« Letzte Änderung: 17 April 2016, 17:57:43 von tupol »
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwicklung: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17003
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #25 am: 17 April 2016, 17:59:12 »
das = ist ja gerade dazu da um jeden parameter zu benennen und nicht mehr von der reihenfolge abhängig zu sein.

zur zeit überschreibt ein weiterer parameter mit gleichem namen auch den zuvor gesetzten.

den fall das es trotzdem noch von der reihenfolge abhängt hatte ich bis jetzt noch nicht.

die frage währe jetzt ob nur die reihenfolge der parameter mit gleichem namen wichtig ist oder auch dir reihenfolge von parametern mit unterschiedlichem namen und wie ein modul das dann der parse routine bekannt gibt.

für ersteres könnte man statt dem wert ein array aus werten in den hash stecken. für die reihenfolge unterschiedlicher parameter untereinander würde ich sagen das ist schon sehr speziell. dafür sollte das modul eine eigene parse routine mitbringen.

ich denke es ist wichtiger die 90% der standard fälle gut abzudecken als viele einzelne unterschiedliche sonderfälle einzubauen und und es dann schwerällig und unübersichtlich zu machen.

eine dritten rückgabe ref mit einem array das auch die reihenfolge der benannten parameter beibehält wäre vielleicht eine option. wer es nicht braucht gibt es einfach nicht mit an.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17003
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #26 am: 17 April 2016, 18:24:42 »
ich habe noch mal geschaut. das automatische unterscheiden von my ($a, $h) = parseParams( \@val );und@val = parseParams( \@val );um automatisch das richtige zurück zu geben geht leider nicht da in beides als list context erkannt wird.

man könnte es zwar so schreiben um die zweite zeile einzuspaaren:@val = @{(parseParams( \@val ))[0]};aber ich glaube das ist nicht wirklich übersichtlicher als zwei zeilen zu spendieren :)


zur reihenfolge der benannten parameter: sollten wir noch eine möglichkeit finden das in die allgemeine routine einzubauen oder ist das zu speziell?
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline Loredo

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2823
  • ~ Challenging Innovation ~
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #27 am: 15 Mai 2016, 14:50:25 »
Hi André,


ich habe gerade festgestellt, dass das Array @a bei Nutzung des modify-Befehls an der zweiten Stelle nicht mehr den Modulnamen hat, sondern direkt den ersten Parameter. Das ist natürlich unschön, wenn man z.B. über FHEMWEB eine Änderung durchführt und die Parameter plötzlich an anderer Stelle sind. Ich habe auch keine Möglichkeit gesehen zu erkennen, ob gerade define oder modify verwendet wird. Ich wollte nur ungern fix auf den Modulnamen an der zweiten Position prüfen, da man ansonsten den 1. Parameter nicht mehr so benennen kann wie das Modul heißt.


Ich schlage also vor, dass auch bei einem modify das Array entsprechend gleich befüllt würd.


Gruß
Julian
FHEM-Module: ENIGMA2, GEOFANCY, ONKYO_AVR, PHTV, RESIDENTS, ROOMMATE, GUEST, HP1000, powerMap, Pushover, THINKINGCLEANER, Wunderground | FHEM-Befehl: msg

FHEM 5.9dev auf Intel NUC mit Proxmox VE
Homematic via HMCCU, Hue Color Bulbs
ONKYO TX-NR626, Philips 55" PFL8008S, Sonos 1xS1, 1xS3, 2xS5

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17423
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #28 am: 15 Mai 2016, 14:57:40 »
Zitat
Ich habe auch keine Möglichkeit gesehen zu erkennen, ob gerade define oder modify verwendet wird.
By modify existiert ein $hash->{OLDDEF}

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 17003
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #29 am: 15 Mai 2016, 15:21:41 »
das ist keine absicht und vermutlich ein copy&paste fehler zwischen define und modify. der TYPE muss vermutlich einfach nur passend vorangestellt werden.

ich schaue es mir an und mache einen patchvorschlag.

ich habe aber gerade nur eingeschränkt zugrif auf einen rechner und es könnte bis dienstag oder mittwoch dauern.

gruss
  andre
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH