Hauptmenü

DOIF für Perlprogrammierer

Begonnen von Damian, 08 März 2017, 21:50:30

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: igami am 10 März 2017, 12:45:03
https://stackoverflow.com/questions/451521/how-do-i-make-private-functions-in-a-perl-module

my $priv_func1 = sub {
    my $self = shift; say 'func1';
};

sub public_sub {
    my $self = shift;

    $self->$priv_func1(@_);
}


ok, das ist schon mal ein Ansatz, allerdings müsste ich dann einen Präprozessor wieder bauen. z. Zt. habe ich einfach eval ("Rest hinter der DOIF-Definition") für die Definition der Funktionen aufgerufen.






Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: igami am 10 März 2017, 07:23:06
Könnte man das nicht als Attribut implementieren
attr di_test MYconvert ($)
{
...}

Wobei ich
attr di_test myfuncs MYconvert ($)
{
...}

besser fände.

Damian

Ich wollte da nicht zu viel Arbeit investieren, es soll weiterhin in erster Linie ein Modul für nicht Perl-Programmierer sein. Mit einem einfachen eval hat man alle Möglichkeiten offen sich in Perl auszutoben. Was z. B. jetzt schon geht ist:

define di_test DOIF (di_test::convert([sens:temperature]) > 30)(set bla on)

##my perl definitions

package di_test;

sub convert ($)
{
  my ($param) = @_;
  my $result;
  ...
  return($result);
}


Damit ist die Funktion gekapselt und stört keinen anderen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Also könnte man ein funktionsloses Perl-Funktionen Sammel-DOIF definieren

define my DOIF ##

##my perl definitions

package my;

sub sub1 ($){...}

sub sub2 ($){...}

sub sub3 ($){...}

...


und in jedem DOIF verwenden mit

my::sub2([device:reading]) ?

Damian

Zitat von: Ellert am 12 März 2017, 17:23:19
Also könnte man ein funktionsloses Perl-Funktionen Sammel-DOIF definieren

define my DOIF ##

##my perl definitions

package my;

sub sub1 ($){...}

sub sub2 ($){...}

sub sub3 ($){...}

...


und in jedem DOIF verwenden mit

my::sub2([device:reading]) ?

ja, all das funktioniert schon mit einem simplen eval. In diesem Teil möchte ich bewusst keinen Einfluss von außen nehmen, deswegen ist es reines Perl mit allem, was dazu gehört.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Ich sehe gerade, dass er zuvor die Bedingung vermisst, das kann ich ihm aber abgewöhnen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#21
Zitat von: Damian am 12 März 2017, 17:32:59
Ich sehe gerade, dass er zuvor die Bedingung vermisst, das kann ich ihm aber abgewöhnen.

Allerdings kann man so eine Definition genauso in myUtils vornehmen, daher wäre das nichts besonderes.

Besser gefallen hätte mir eine pro DOIF-Instanz gekapselte Definition, bei der man die Funktion im jeweiligen DOIF ohne package-Angabe in der Bedingung nutzen könnte. Was mir aber noch fehlt, ist in dem package der jeweiligen Instanz der Zugriff auf alle restlichen definierten Funktionen in FHEM.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF