FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: heikoh81 am 15 Januar 2016, 16:11:30

Titel: Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: heikoh81 am 15 Januar 2016, 16:11:30
Halo zusammen,

ich habe in meiner 99 myUtils einige Funktionen.
Eine davon, die ich sehr oft verwende, möchte ich um einen optionalen Parameter erweitern.
D.h. nur wenn ich die Funktion explizit mit einem Wert für den optionalen Parameter aufrufe, soll dieser übergeben werden, sonst soll der Wert NULL oder "0" sein.

Ich möchte nicht alle Funktionsaufrufe in Timern etc. überarbeiten (zur Not ginge es auch mit Suchen & Ersetzen...).

Geht das?
Und wenn ja, wie?

Viele Grüße,
Heiko
Titel: Antw:Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: CoolTux am 15 Januar 2016, 16:16:46

sub test($,$)


Ich glaube mich erinnern zu können das es wohl so gehen soll. nach dem Komma ist dann optional.



Grüße
Titel: Antw:Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: Hans Franz am 15 Januar 2016, 16:19:35
Muss, glaube ich, ein Semikolon sein. Oder ganz ohne Angabe von Parametern a la:
sub name {

Gruß
Hans
Titel: Antw:Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: jojoja am 15 Januar 2016, 16:28:53
Hallo Heiko,

hier ein Beispiel aus meinen Utils:

sub defineUhrzeitAnsage ($;$$){
my ($player, $count, $volume) = @_;

        #Standardwert für String setzen, wenn nicht übergeben
$volume //= "40";

        #Standardwert für Integer setzen, wenn nicht übergeben
$count = 0 unless $count;
...
}


Gruß Johannes
Titel: Antw:Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: CoolTux am 15 Januar 2016, 16:38:33
Ah ok, Semikolon. Genau das war es. Hatte das nur noch so in Erinnerung aus meiner letzten Codeschnüffelei.
Titel: Antw:Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: heikoh81 am 15 Januar 2016, 19:37:35
Hallo zusammen,

vielen Dank für eure schnellen Antworten.
Das ist genau, wonach ich gesucht habe.

Zitat von: jojoja am 15 Januar 2016, 16:28:53
sub defineUhrzeitAnsage ($;$$){
my ($player, $count, $volume) = @_;

        #Standardwert für String setzen, wenn nicht übergeben
$volume //= "40";

        #Standardwert für Integer setzen, wenn nicht übergeben
$count = 0 unless $count;
...
}


Ich konnte mir trotz Google-Suche das "//=" nicht erklären, ganz unten auf der Seite.
https://de.wikibooks.org/wiki/Perl-Programmierung:_Operatoren (https://de.wikibooks.org/wiki/Perl-Programmierung:_Operatoren)
Der defined-or Operator
Neu in Perl 5.10 ist der defined-or operator // bzw. //=. Er überprüft nicht den Wahrheitsgehalt seines Argumentes, sondern die Definiertheit.


Bedeutet das, dass "40" nur in $volume geschrieben wird, wenn kein Wert übergeben wurde?
Und bedeutet der "unless"-Befehl dann das gleiche?

Viele Grüße,
Heiko
Titel: Antw:Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: betateilchen am 15 Januar 2016, 19:43:27
Zitat von: Hans Franz am 15 Januar 2016, 16:19:35

Oder ganz ohne Angabe von Parametern


das ist die einfachste Lösung...
Titel: Antw:Funktion in 99 myUtils: Optionaler Parameter?
Beitrag von: luetty am 15 Januar 2016, 19:56:08
Hallo heikoh81,

erst vorgestern stand ich vorm gleichen Problem.  ::)
Wenn Du Pflichtparameter hast, dann deklarierst Du deine Sub mit ($), wenn PflichtParameter und optionalem Parameter dann mit ($;$) und wenn nur mit optionalem Parameter, dann mit (;$).

Alles nach dem Semikolon ist optional ein $ natürlich für jeden Parameter!

Funktioniert bei mir:
sub istWeihnachtszeit(;$) {...}

Der optionale Parameter bei mir ist eine LogAusgabe mit der aktiven "Weihnachtszeit" (Beleuchtung aktiv).


ciao
luetty