Modulentwicklung: Verwirrung um Parameter bei subs

Begonnen von Thyraz, 02 Mai 2017, 12:20:26

Vorheriges Thema - Nächstes Thema

Thyraz

Hallo zusammen,

hoffe die Frage ist hier in Ordnung wenn man nicht in im Developers Forum posten kann. ;)

Hatte schon länger vor auch programmierseitig etwas tiefer in FHEM einzutauchen und versuche mich zur Zeit an meinem ersten Modul.
Da ich zwar einiges an Progammiererfahrung habe, aber vor FHEM nie mit PERL in Berührung kam, schweben hier und da ein paar Fragezeichen über mir.

Wenn man sich die Subs im DevelopmentIntro anschaut, sieht man hier teilweise eine unterschiedliche Anzahl Parameter im Prototype und im nachfolgenden Beispielcode.
Oder sogar unterschiedliche Prototypes in Beispielen zur selben Funktion.

Beispiel 1 aus dem Link:

sub X_Set ($$@)
{
my ( $hash, $name, $cmd, @args ) = @_;
...


Beispiel 2 aus dem Link:

sub X_Set($@)
{
my ( $hash, $name, $cmd, @args ) = @_;
...


In beiden Fällen werden aber nicht ein oder zwei Skalare Variablen gefolgt von einem Array aus den Argumenten geholt, sondern drei.

Müsste das nicht so aussehen

sub X_Set($$$@)


Im Netz findet man auf ziemlich alle Frage zu Perl und Prototypes, dass man sie normal gar nicht verwenden sollte.
Das Ganze wäre sowieso nicht dazu gedacht Typ und Anzahl der Parameter zu verifizieren (und macht es ja wohl auch nicht).

Gibt es einen Grund warum es in FHEM dennoch recht häufig zu sehen ist?
Und ergibt das weiter oben doch einen Sinn den ich bisher nicht zu erfassen vermag? ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

rudolfkoenig

@ im Prototyp kann man als eine Liste von Parametern verstehen, mit $$@ sagt die Deklaration, dass es mindestens zwei Parameter gibt. In deinem Beispiel kriegen die ersten drei Parameter explizit einen Namen, der Rest landet im @args.

Nach einigen Meinungen sind Prototypen in Perl eher schaedlich, weil sie nicht genau das machen, was die Leute erwarten, siehe auch http://www.perlmonks.org/?node_id=861966