Hallo,
hab mich mit meiner Frage hier (https://forum.fhem.de/index.php/topic,82631.msg793936.html#msg793936) jetzt etwas näher beschäftigt.
Mit
{fhem ("set Echo item_shopping_delete ".(split(",",ReadingsVal("Echo","list_SHOPPING_ITEM","")))[0])}
kann ich jetzt schonmal immer den ersten Wert des Readings löschen.
Jetzt hätte ich als nächstes vor zu prüfen ob das Reading Text enthält und wenn das der Fall ist wiederholt den set Befehl auszuführen, bis das Reading leer ist. (So mein Gedanke zur Umsetzung)
Mir ist aber nicht ganz klar wie ich die Prüfung ob das Reading Text enthält umsetzen muss
Versucht hab ich's bisher erfolglos in etwa so:
{if (length(ReadingsVal("Echo", "list_SHOPPING_ITEM ", "") ne "")){fhem ("set Echo item_shopping_delete ".(split(",",ReadingsVal("Echo","list_SHOPPING_ITEM","")))[0])}}
Mal ganz davon abgesehen das das ganze noch wiederholt werden muss bis das Reading leer ist.
Kann mir wer ein paar Stichworte, Schlagwörter, ein Hieb in die richtige Richtung geben wie ich da weiter komme.
Gruß
Thomas
Warum schießt Du Dir immer mit Deiner Einkaufsliste durch das Auge und die Brust ins Knie?
Du hast doch neulich schon gezeigt bekommen, wie man ein Array verarbeitet. Und perl bietet Standardfunktionen, um ein array so lange zu bearbeiten, bis es leer ist.
Es macht's nicht einfacher das gerade du hier jetzt lauerst, aber ich zeig mal was dabei rauskam nachdem ich etwas mehr nachgedacht habe.
Denke das es nur noch an der Püfung liegt
while(length($sl ne ""))
Sonst, hoff ich, das ich nicht voll auf dem Holzweg bin und den richtigen Weg eingeschlagen habe
{ my $sl = (split(",",ReadingsVal("Echo","list_SHOPPING_ITEM","")))[0];; while(length($sl ne ""));; {fhem ("set Echo item_shopping_delete $sl")}}
und das liefert
syntax error at (eval 1715875) line 1, at EOF
Jetzt bin ich doch ganz nah dran ?
Bekomme keine Fehlermeldung mehr aber es funktioniert trotzdem nicht:
{ foreach my $sk (ReadingsVal("Echo","list_SHOPPING_ITEM","")) {fhem ("set Echo item_shopping_delete $sk")}}
Also ich sehe in den ganzen ausgewählten Codeschnipseln von dir nirgendwo auch nur ein Array '@'...
Und vielleicht gehst du dazu über ALLES zu posten was du (gemacht) hast...
...und nicht nur ausgewählte Teile (von denen du denkst dass dort der Fehler/das Problem liegt)...
Dann wäre Hilfe sicher optimaler möglich...
Wie wär's mal mittels google etc. bzgl. Arrays und perl zu suchen?
Z.B. einfach ganz schnell gesucht/gefunden: https://www.tutorialspoint.com/perl/perl_arrays.htm
Gruß, Joachim
ZitatAlso ich sehe in den ganzen ausgewählten Codeschnipseln von dir nirgendwo auch nur ein Array '@'...
Bin/war der Meinung das das was
ReadingsVal("Echo","list_SHOPPING_ITEM",""
liefert, ein Array ist, eine kommaseparierte Liste.
ZitatUnd vielleicht gehst du dazu über ALLES zu posten was du (gemacht) hast...
...und nicht nur ausgewählte Teile (von denen du denkst dass dort der Fehler/das Problem liegt)...
Geb das was ich bisher gezeigt habe in der Kommandozeile ein, da gibt's nicht mehr.
ZitatWie wär's mal mittels google etc. bzgl. Arrays und perl zu suchen?
Hab heut nacht hier gesucht und gefunden:
http://olymp.idle.at/~apollo/books/Perl%20in%2021%20Tagen/Kap04.html (http://olymp.idle.at/~apollo/books/Perl%20in%2021%20Tagen/Kap04.html)
Zitat von: TomLee am 15 April 2018, 08:36:05
Bin/war der Meinung das das was ReadingsVal("Echo","list_SHOPPING_ITEM",""
liefert, ein Array ist, eine kommaseparierte Liste.
Mag ja sein aber du "speicherst" es in einer Variablen '$' und eben nicht in einem Array '@'...
...auch das Ergbnis des split nicht...
Also: nie (konnte zumindest wie gesagt kein einziges Array entdecken)
Wie willst du über ein Array itterieren/parsen, wenn du gar keines hast!?
EDIT: und auch in dem von dir verlinkten Tutorial steht:
Zitat@zahlen = (1, 2, 3, 4);
Ich würde "komplexere" Funktionen mal in eine myUtils-Sub auslagern und dort auch mal Logausgaben einbauen, dann siehst du (und andere) was du tatsächlich beispielsweise in einer Variablen etc. hast und nicht was du zu haben glaubst...
Gruß, Joachim
ZitatIch würde "komplexere" Funktionen mal in eine myUtils-Sub auslagern und dort auch mal Logausgaben einbauen, dann siehst du (und andere) was du tatsächlich beispielsweise in einer Variablen etc. hast und nicht was du zu haben glaubst...
Das würde/werde ich gerne machen, mit der myutils arbeiten.Ist das irgendwo dokumentiert das mit den Logausgaben oder muss ich mir das anhand von Beispielen im Forum ableiten.
Sry aber ich muss fragen. Hab ich jetzt ein Array
{ my @liste = ReadingsVal("Echo","list_SHOPPING_ITEM","");;foreach my $sk (@liste) {fhem ("set Echo item_shopping_delete $sk")}}
Zitat von: TomLee am 15 April 2018, 10:30:36
Sry aber ich muss fragen. Hab ich jetzt ein Array
{ my @liste = ReadingsVal("Echo","list_SHOPPING_ITEM","");;foreach my $sk (@liste) {fhem ("set Echo item_shopping_delete $sk")}}
Keine Ahnung, da ich nicht weiß was deine ReadingsVal-Abfrage in dem Fall liefert...
Aber ich denke (so wie ich es lese) müsstest du die ReadingsVal-Abfrage in einer Variablen "speichern" und diese dann mittels 'split' (ich glaube die Einkaufsliste ist ja eine Komma-separierte Liste) in ein Array "schreiben"...
Und das dann mittels foreach itterieren...
Hier etwas bzgl. myUtils: https://wiki.fhem.de/wiki/99_myUtils_anlegen
Logausgaben: Log3(undef, 3, "Das ist die Logausgabe. Das der Inhalt einer Variablen: $Variable")
Gruß, Joachim
ZitatAber ich denke (so wie ich es lese) müsstest du die ReadingsVal-Abfrage in einer Variablen "speichern" und diese dann mittels 'split' (ich glaube die Einkaufsliste ist ja eine Komma-separierte Liste) in ein Array "schreiben"...
Verständnisfragen hätt ich:
Darf es keine komma-separierte Liste sein ?
Müssen/dürfen die Werte des Arrays nur durch Leerzeichen getrennt sein ?
Darum mittels split in ein Array ?
Auf der Tutorial -Seite sind die Werte einer Liste auch immer durch Komma und zusätzliches Leerzeichen getrennt oder sogar in Hochkommas und werden bei späterer Verwendung nicht nochmal mit split angepasst.
Funktioniert der Code den du hast?
Ja, dann hast du ein Array aus ReadingsVal bekommen (denke aber eher dass nicht)...
Du bekommst (vermutlich) als Ergebnis von ReadingsVal einen String mit Komma-separierten Text-Teilen, daher eben split um die "auseinander zu sortieren" und dann in einem Array zu haben...
Wenn du das in eine Sub auslagerst und dir die einzelnen Variablen ausgeben lässt, siehst du was du jeweils hast und was du dann weiter tun musst...
EDIT: in dem Tutorial wird das Array beim Definieren/Anlegen "vorbelegt". Das ist was anderes als ein String wo "Komma-Sachen" drin stehen...
EDIT2: Variable vom Typ String ist ein Array aus CHAR, nicht ein Array aus den durch Komma getrennten Text-Teilen. Durch split (Trennzeichen ',') kannst du dann ein Array mit den einzelnen Text-Teilen machen (das ist verm. was du brauchst)...
Gruß, Joachim
String
"alles,b,c,d,e,f"
Liste Komma separiert für Array
"alles","b","c","d","e","f"
ZitatListe Komma separiert für Array
"alles","b","c","d","e","f"
so muss ich die Liste mit split formatieren, richtig ?
Nein. Split erstellt bereits ein Array
my @array = split(',', ReadingsVal (Blabla...);
Erstellt ein Array wenn der Inhalt des Readings eine Reihe Werte mit Komma getrennt ist.
{my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""))}
Weshalb bekomme ich hier aber eine 4 zurück. Das kann ja nur die Anzahl sein. Die Position (Array-Indizes) kann es nicht sein weils nur vier Einträge gibt. Hätte hier jetzt als Ergebnis
"bleistifte","plastik","lampe","zahnpasta"
erwartet.
Du erhältst die Arraygröße, also 4 Einträge...
In @array sollte drin stehen was du brauchst...
Zugriff $array[0] bis $array[3]
Oder eben foreach...
Gruß, Joachim
Es wird dir die Anzahl der Element im Array an gezeigt. Wie du die Elemente aus ließt findest du im Netz.
Mann, Mann schwere Geburt und so klein am Ende. Hab's endlich und weiß nicht was da die ganze Zeig so schwierig dran war.
sub delech() {
my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""));
foreach my $sk (@array)
{fhem ("set Echo item_shopping_delete $sk");
}}
Danke an alle
Bitte gerne!
Macht nix, dass es so lange war...
...und dass es jetzt so einfach scheint, zeigt: was gelernt...
Dann noch als gelöst kennzeichnen, umbenennen in beispielsweise [gelöst] mehrmalige Ausführung eines Befehls bis Prüfung kein Text (leer) ergibt
Gruß, Joachim