Frage zum dritten optionalen Parameter zu Each

Begonnen von TomLee, 25 Juli 2020, 15:25:43

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

wenn ich den dritten Parameter mit angebe fängt EACH_INDEX nicht nach dem letzten Element von vorne an, sondern durchläuft die Anzahl Zeichen die das Array hat und fängt dann erst wieder von vorne an.

Ist das so gedacht ?

{my $var = ("0|1|D");;Each("du_Test", "$var","|");; }

Gruß

Thomas

Beta-User

MAn vermischst du da zwei Dinge:

Generell: fhem.pl-Each läuft immer das angegebene Array in gleicher Weise durch, egal, ob man jetzt einen Separator angibt oder nicht.
Separator: Der dritte Parameter dient nur dazu, das Trennzeichen anders zu definieren, genau so, wie du das in deinem Beispiel verwenden willst. (Die Klammern bei der Variablendefinition sind wohl unnötig).

Die relevanten Zeilen aus fhem.pl (#5665ff)
my ($dev, $string, $sep) = @_;
...
$sep = "," if(!$sep);
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Zitat von: Beta-User am 26 Juli 2020, 07:56:45
(Die Klammern bei der Variablendefinition sind wohl unnötig).

genauso unnötig wie die Anführungszeichen um $var in Each();

perl Grundlagen...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#3
Keiner von euch beiden hat das wirklich ausprobiert.

Der EACH_INDEX geht bis 5 mit

{my $var = "0|1|D";;Each("du_Testy2", $var,"|")}


Und wie vorgesehen bis 3 mit

{my $var = "0,1,D";;Each("du_Testy2", $var)}

Beta-User

Interessant...
Die Funktion scheint ein Problem mit pipe als Trennzeichen zu haben, das hier klappt nämlich ohne weiteres:
{my $var = "0 1 D";;Each("devStrich0", $var," ")}

(EDIT: scheint sich überschnitten zu haben)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Zitat von: Beta-User am 26 Juli 2020, 10:44:52
Die Funktion scheint ein Problem mit pipe als Trennzeichen zu haben,

Das pipe-Problem ergibt sich aus der Tatsache, dass perl bei split() jedes Trennzeichen != space als regex behandelt.
Insofern dürfte das Verhalten nicht nur bei | auftreten, sondern auch bei anderen regex-spezifischen Zeichen (. $ ^ usw.) als versuchte Trennzeichen.

was hatte Rudi eigentlich genommen, als er eine Funktion in die fhem.pl gebaut hat, die genau so heißt (das große E am Anfang macht für mich da keinen Unterschied), wie eine perl-Standardfunktion, die was ganz anderes tut?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Zitatgenauso unnötig wie die Anführungszeichen um $var in Each();

perl Grundlagen...

Hast du bitte auch eine Erklärung warum ich sie in der myUtils brauche sonst klappts nämlich nicht:

Zitatif ($dudevstate eq 'Sonos') {
       if ($rcCode eq '0x20DF4EB1') {
          my $var = ReadingsVal("$sondev","RadiosList","unknown");      
         my @ar = split (/\|/,ReadingsVal("Sonos_Wohnzimmer","RadiosList","unknown"));
         my @arr= join(",", map {"/".$_."/" } @ar);
         return fhem("set $sondev StartRadio ".Each("$sondev", @arr));
          }
       if ($rcCode eq '0x20DF22DD') {
          return fhem("set $sondev Play")  if $sondevstate eq 'STOPPED';
          return fhem("set $sondev Pause") if $sondevstate eq 'PLAYING';
   }
   return fhem("set $sondev VolumeD") if $rcCode eq '0x20DFE01F';
   return fhem("set $sondev VolumeU") if $rcCode eq '0x20DF609F';
   }

betateilchen

Das kann ich Dir vielleicht beantworten, wenn ich verstanden habe, warum Du einen einzelnen String in ein array schreibst anstatt in einen scalar. (das Ergebnis von join() ist immer ein scalar)

Und vielleicht verstehe dann auch, was die Wertzuweisung an $var bezweckt, wenn $var danach nirgends verwendet wird.

Aber heute ist es mir zu spät, um das wirklich noch verstehen zu wollen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Zitat... was die Wertzuweisung an $var bezweckt, wenn $var danach nirgends verwendet wird.

Ein Überbleibsel von der vorherigen Lösung.




Wenn ich eine skalare Variable verwende brauch ich auch keine ", hoffe so war das gemeint, nur so kann ich das heut noch nachvollziehen.

if ($dudevstate eq 'Sonos') {
    if ($rcCode eq '0x20DF7887') {
    my @ar = split (/\|/,ReadingsVal("$sondev","RadiosList","unknown"));
my $arr= join(",", map {"/".$_."/" } @ar);
return fhem("set $sondev StartRadio ".Each("$sondev", $arr));
    }....


Danke

betateilchen

#9
Ich würde übrigens auf das komplette split, map und join verzichten, weil komplett entbehrlich.



    if ($rcCode eq '0x20DF7887') {
    my $l = ReadingsVal($sondev,"RadiosList","unknown");
$l =~ s/\|/,/g;
return fhem("set $sondev StartRadio /".Each($sondev, $l)."/");
    }....



Gute Nacht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Mit deinem Vorschlag kommt man sich richtig doof vor, warum ich es "so umständlich" angegangen bin.
Aber viel gelesen, gelernt und auch verstanden dabei.

Wichtig war auch genau die Frage das die gestellt wurde:
Zitatwarum Du einen einzelnen String in ein array schreibst anstatt in einen scalar. (das Ergebnis von join() ist immer ein scalar)
Weil genau das war offensichtlich ja noch unklar und mein ich jetzt verstanden zu haben. (Bleibt die Frage wie lange  :P)

Selbst wenn ich auf die Lösung gekommen wäre hätte ich vermutlich den einen / bei set $sondev StartRadio /" hinter den " angegeben, statt gleich mitzugeben.

DANKE