FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: CoolTux am 08 November 2018, 14:59:47

Titel: [gelöst] sub innerhalb eines Funktionsaufrufes
Beitrag von: CoolTux am 08 November 2018, 14:59:47

CommandAttr( undef, $name . ' ASC_twilightDevice ' . sub { my @test = devspec2array('TYPE=(Astro|Twilight)'); return $test[0]; } );


Das gibt mir natürlich eine Referenz als Attributwert.
Eigentlich möchte ich nur erreichen das wenn devspec2array mir wie ein Eintrag hat er mir doch bitte nur den ersten als Attributwert schreibt. Da bin ich dann auf die Idee mit der sub gekommen.
Jemand eine bessere Idee oder wenn mit sub wie ich das korrekt machen muss damit auch der return Wert raus kommt.

Ich weiß das wenn

my $subwert = sub { my @test = devspec2array('TYPE=(Astro|Twilight)'); return $test[0]; };
$subwert = \$subwert;

geht. Aber ich wollte es eigentlich so schön innerhalb der CommandAttr Funktion als Parameterübergabe einbeten.


Grüße
Titel: Antw:sub innerhalb eines Funktionsaufrufes
Beitrag von: Thorsten Pferdekaemper am 08 November 2018, 15:11:14
Hi,
versuch mal, "sub" und "return" wegzulassen, also so:

CommandAttr( undef, $name . ' ASC_twilightDevice ' . { my @test = devspec2array('TYPE=(Astro|Twilight)'); $test[0]; } );

Ich hab das jetzt nicht komplett ausprobiert, aber ich sehe da eine Chance...
Gruß,
   Thorsten
Titel: Antw:sub innerhalb eines Funktionsaufrufes
Beitrag von: CoolTux am 08 November 2018, 15:22:19
Leider nicht. Fetter Syntaxerror. Aber Danke fürs Nachdenken.
Titel: Antw:sub innerhalb eines Funktionsaufrufes
Beitrag von: Thorsten Pferdekaemper am 08 November 2018, 15:31:59
Hi,
ich denke, dass Du die sub auch aufrufen musst, wenn Du es mit sub machst:

{ "hello". sub { my @test = ("1"," world","3");; $test[1] }->() }

Das ergibt im FHEM-Kommandofeld "hello world".
...also das könnte bei Dir gehen:

CommandAttr( undef, $name . ' ASC_twilightDevice ' . sub { my @test = devspec2array('TYPE=(Astro|Twilight)'); return $test[0]; }->() );

Gruß,
   Thorsten
Titel: Antw:sub innerhalb eines Funktionsaufrufes
Beitrag von: CoolTux am 08 November 2018, 15:37:20
Hallo Thorsten,

Du bist Gold wert. Das könnte es sein. Bin leider gerade unterwegs. Aber genau das mit dem Referenzaufruf habe ich gesucht. Ähnliche Aufrufe habe ich bei den perlmonks gefunden aber halt nicht genau so. Ich berichte heute Abend.
Titel: Antw:sub innerhalb eines Funktionsaufrufes
Beitrag von: CoolTux am 08 November 2018, 16:04:32
Was soll ich sagen. Konnte es nicht abwarten und habe es eben mal getestet. Geht astrein. Vielen lieben Dank Thorsten.


Grüße
Titel: Antw:[gelöst] sub innerhalb eines Funktionsaufrufes
Beitrag von: Thorsten Pferdekaemper am 08 November 2018, 16:23:55
Hi,
Deine netten Worte haben mich angespornt, das noch etwas eleganter hinzuschreiben:

CommandAttr( undef, $name . ' ASC_twilightDevice ' . (devspec2array('TYPE=(Astro|Twilight)'))[0] );

...es geht ja nur darum, den Interpreter in den Array-Kontext zu zwingen.
Gruß,
    Thorsten
Titel: Antw:[gelöst] sub innerhalb eines Funktionsaufrufes
Beitrag von: CoolTux am 08 November 2018, 16:43:55
Oh man jetzt mal ehrlich, darauf hätte ich echt auch kommen können, zumal ich das so schon an anderen Stellen in meinen Modulen mache.
War zu einfach, aber mir geht es auch um den Lerneffekt. Und das mit den anonymen Subs wollte ich schon immer mal testen.
Für die jetzige Aufgabe nehme ich natürlich das einfache.

Vielen lieben Dank noch mal.


Grüße
Titel: Antw:[gelöst] sub innerhalb eines Funktionsaufrufes
Beitrag von: Thorsten Pferdekaemper am 08 November 2018, 18:01:37
Zitat von: CoolTux am 08 November 2018, 16:43:55aber mir geht es auch um den Lerneffekt.
So ging's mir auch. Deshalb habe ich mir auch zuerst das mit der sub überlegt. War eine nette kleine Knobelei...
Gruß,
   Thorsten