(gelöst) Array im zweiten Parameter von Each verwenden

Begonnen von TomLee, 25 Dezember 2020, 22:21:42

Vorheriges Thema - Nächstes Thema

TomLee

Mit
{my @w=(1..99)}

weise ich meinem Verständnis nach der Arrayvariablen ein Array zu das eine Liste von Zahlen kommasepariert von 1-99 enthält.

(1,2,3,...97,98,99)


Die Liste ist noch unsortiert, das mach ich mit:

{my @w=(1..99);;@w=sort{$a<=>$b}(@w);;print "@w\n"}

ergibt im Log:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

Mit der Funktion Each verhält es ich bisher so:

Bei:

{my @w=(1..99);;my @s=sort{$a<=>$b}(@w);;Each("du_Testy",@s)}


bekomm ich immer 99 zurück. Der EACH_INDEX wird auf 1 gesetzt und egal wie oft ich die Funktion aufrufe es bleibt bei 1.


Setz ich den zweiten Parameter in doppelte Hochkomma:

{my @w=(1..99);;my @s=sort{$a<=>$b}(@w);;Each("du_Testy","@s")}


bekomme ich zurück:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

egal wie oft ich die Funktion aufrufe es bleibt bei einem EACH_INDEX von 1.

Was mach/verstehe ich falsch, wie macht mans richtig, die zugewiesene Liste ist doch kommasepariert ?

Gruß

Thomas


betateilchen

Zitat von: TomLee am 25 Dezember 2020, 22:21:42
Was mach/verstehe ich falsch, wie macht mans richtig, die zugewiesene Liste ist doch kommasepariert ?

Du hast noch nicht verstanden, dass das array beim ersten Aufruf EINMAL von Each() gespeichert und dann bei jedem weiteren Aufruf verarbeitet wird.

Was Du aber tust: Du befüllst in Deinem Code das array jedesmal neu, deshalb ist der Index immer 1.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

ZitatWas Du aber tust: Du befüllst in Deinem Code das array jedesmal neu, deshalb ist der Index immer 1.

Und das verhindere ich in dem ich das Array in einer skalaren Variable "ablege" ?

{my @w=(1..99);;@w=sort{$a<=>$b}(@w);;my $s=join(",",@w);;Each("du_Testy",$s)}

justme1968

du initialisierst ein array mit dem range 0..99.

da ist nix komma separiert. list haben ach immer eine ordnung. und sortiert ist es ebenfalls schon. der range operator erzeugt aufsteigende reihenfolgen.


das fhem Each arbeitet nicht auf listen oder arrays sondern auf strings. du musst aus deinem array mit join einen string machen.

array kann man nicht in skalaren variablen ablegen. ein array in diesem kontext gibt nur die anzahl der elemente zurück. deshalb 99. aber das ist im Each fall blödsinn.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

TomLee

#4
OK, OK, falsche Wortwahl, dann hab ich halt mit join aus dem Array jetzt einen String gemacht, ist doch dann korrekt !?

Zitatund sortiert ist es ebenfalls schon. der range operator erzeugt aufsteigende reihenfolgen.

Ich gebe zu das ich gar nicht geprüft hatte was
{my @w=(1..99);;print "@w\n"}
zurückgibt, ohne sort zu verwenden.

Nur gelesen das der sort-Operator ein Array immer auf Stringbasis - auch wenn ein reines Zahlenarray vorliegt- sortiert und das dann kontrolliert was die Ausgabe ist:

use strict;
use warnings;
use 5.010;

my @w=(1..99);
my @s=sort(@w);
print "@s\n\n";

1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 26 27 28 29 3 30 31 32 33 34 35 36 37 38 39 4 40 41 42 43 44 45 46 47 48 49 5 50 51 52 53 54 55 56 57 58 59 6 60 61 62 63 64 65 66 67 68 69 7 70 71 72 73 74 75 76 77 78 79 8 80 81 82 83 84 85 86 87 88 89 9 90 91 92 93 94 95 96 97 98 99


Und dann davon ausgegangen das ich auf jedenfall noch nach Zahlen sortieren muss.

use strict;
use warnings;
use 5.010;

my @w=(1..99);
my @s=sort{$a<=>$b}(@w);
print "@w\n";

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99


Trotzdem Danke für die Erläuterungen.