Funktion in 99 myUtils: Optionaler Parameter?

Begonnen von heikoh81, 15 Januar 2016, 16:11:30

Vorheriges Thema - Nächstes Thema

heikoh81

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

CoolTux


sub test($,$)


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



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Hans Franz

#2
Muss, glaube ich, ein Semikolon sein. Oder ganz ohne Angabe von Parametern a la:
sub name {

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

jojoja

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
FHEM 6.0 @ IntelNUC6CAYH;  Unifi USG, Switch, AP AC Pro; HM-MOD-UART;  Sonos Play 1 & 3, One, Beam; Philips Hue

CoolTux

Ah ok, Semikolon. Genau das war es. Hatte das nur noch so in Erinnerung aus meiner letzten Codeschnüffelei.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

heikoh81

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
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

betateilchen

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

luetty

#7
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