FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: TomLee am 25 Juli 2020, 15:25:43

Titel: Frage zum dritten optionalen Parameter zu Each
Beitrag von: TomLee am 25 Juli 2020, 15:25:43
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
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: Beta-User am 26 Juli 2020, 07:56:45
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);
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: betateilchen am 26 Juli 2020, 10:19:50
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...
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: TomLee am 26 Juli 2020, 10:27:48
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)}
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: Beta-User am 26 Juli 2020, 10:44:52
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)
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: betateilchen am 26 Juli 2020, 12:04:51
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?
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: TomLee am 26 Juli 2020, 20:50:06
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';
   }
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: betateilchen am 26 Juli 2020, 23:26:45
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.
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: TomLee am 27 Juli 2020, 01:28:20
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
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: betateilchen am 27 Juli 2020, 02:04:07
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.
Titel: Antw:Frage zum dritten optionalen Parameter zu Each
Beitrag von: TomLee am 27 Juli 2020, 17:19:21
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