Hauptmenü

richtige Perl Syntax

Begonnen von dt2510, 21 Februar 2017, 11:18:06

Vorheriges Thema - Nächstes Thema

dt2510

Als Neuling in Perl hab' ich immer noch das ein oder andere Problem.
Ich habe zu meinen Lampen/Rolläden noch zusätzliche Steuerinformationen in Dummies gespeichert. Um nicht für jeden Aktor den Quelltext kopieren zu müssen,
würde ich gerne einer Funktion den Namen des Aktors übergeben und mir die Dummy-Namen daraus zusammenbauen.

Beispiel:

Schalter Definition
define FGS212_ID10 ZWave xxxxxxxx 10

Dummies
define FGS212_ID10_AwayDay dummy
define FGS212_ID10_AwayNight dummy
define FGS212_ID10_AwayAuto dummy
...
define HomeStatus dummy
attr HomeStatus setlist Home Bed Away Holiday


Parameter: FGS212_ID10
HomeStatus: "Away"
isday("Civil") ist TRUE (also Tag)

Variable 1: FGS212_ID10_ + HomeStatus + Auto => FGS212_ID10_AwayAuto
Variable 2: FGS212_ID10_ + HomeStatus + Day => FGS212_ID10_AwayDay
Variable 3: FGS212_ID10_ + HomeStatus + Night => FGS212_ID10_AwayNight

wenn Variable 1 jetzt "on" ist (also automatisch geschaltet werden soll) soll der Aktor im Parameter auf den Inhalt von Variable 2 bzw. 3 gesetzt werden je nach Tageszeit (hier: Variable 2)

Wie kann ich die Variablennamen in Perl zusammensetzen ?

dt2510

könnte das in etwa so gehen ?

sub SetDevice($) {
  my ($device) = @_;
  my ($home) = Value("HomeStatus");
  my ($auto) = $device."_".$home."Auto";
  my ($day) = $device."_".$home."Day";
  my ($night) = $device."_".$home."Night";
  if (isday("CIVIL") && (Value($auto) eq "on")) {fhem("set $device ".Value($day));}
  if (!isday("CIVIL") && (Value($auto) eq "on")) {fhem("set $device ".Value($night));}
}

Thorsten Pferdekaemper

Zitat von: dt2510 am 21 Februar 2017, 11:58:24
könnte das in etwa so gehen ?
Probier's doch einfach aus...
Gruß,
   Thorsten
FUIP

dt2510


betateilchen

Trotzdem sind in Deinem Konstrukt viel zu viele Klammern, wo keine hingehören und die in anderen Szenarien durchaus zu Problemen führen können.

Tipp: Beschäftige Dich mit den absoluten perl Grundlagen - denn die sind nicht FHEM-spezifisch.

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

dt2510

Ich hab' es mal angepasst. Der Dummy "FHEMMode" enthält schon "Day" bzw. "Night", kann also dierekt ausgewertet werden.

sub SetDevice($) {
  my $myDevice = @_;
  my $myHomeStatus = Value("HomeStatus");
  my $myFHEMMode = Value("FHEMMode");
  my $myAuto = $myDevice."_".$myHomeStatus."Auto";
  my $myDefault = $myDevice."_".$myHomeStatus.$myFHEMMode;
  if (Value($myAuto) eq "on") {fhem("set $myDevice ".Value($myDefault));}
}


Ich wüsste nicht, wo ich jetzt noch Klammern einsparen könnte (ich komme ursprünglich von Pascal/Delphi und programmiere hauptsächlich IBM/370 Assembler ;) ). Falls doch wäre ich für einen Hinweis dankbar.

dt2510

Noch eine Frage ... wo liegt hier der Fehler ?

sub SetFHEMMode($) {
  my $myNewMode = @_;
  my $myAutoMode = "Day";
  if (!isday("Civil")) {$myAutoMode = "Night";}
  if ($myNewMode eq "Auto") {$myNewMode = $myAutoMode;}
  fhem("set FHEMMode $myNewMode");
}


Es wird "Day", "Night" oder "Auto" übergeben. Im Falle von "Auto" soll der Wert entsprechend der Tageszeit in "Day" oder "Night" geändert werden.
FHEMMode hat nach Aufruf der Funktion aber nicht den Wert "Day" sondern 1 !?

Thorsten Pferdekaemper

Hi,

my ($myNewMode) = @_;

Die Klammern werden hier gebraucht. Warum das so ist überlasse ich dem geneigten Leser als Übung.  :P
Gruß,
  Thorsten
FUIP

betateilchen


  • fehlende perl Grundlagen - Du hast Klammern auch da entfernt, wo sie sein müssen
  • Groß-/Kleinschreibung beachten


sub SetFHEMMode($) {
  my ($NewMode) = @_;
  if ($NewMode eq "Auto") { $NewMode = isday("CIVIL") ? "Day" : "Night"; }
  fhem("set FHEMMode $NewMode");
}

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

dt2510

Hat funktioniert ...

Also ich bin seit 26 Jahren Programmierer (angefangen hab' ich vor über 30 Jahren) , aber Perl ist im Vergleich zum Rest alles andere als logisch.
In meinem Beispiel von oben müsste es dann analog
my ($myDevice) = @_;
sein oder ?


Thorsten Pferdekaemper

Zitat von: dt2510 am 21 Februar 2017, 13:41:17aber Perl ist im Vergleich zum Rest alles andere als logisch.
Im Prinzip gebe ich Dir Recht, aber nicht in diesem Fall.

Zitat
In meinem Beispiel von oben müsste es dann analog
my ($myDevice) = @_;
sein oder ?
Ja.
Gruß,
   Thorsten
FUIP

betateilchen

Zitat von: dt2510 am 21 Februar 2017, 13:41:17
aber Perl ist im Vergleich zum Rest alles andere als logisch.

Ich programmiere auch seit über 30 Jahren und bin zu folgender Erkenntnis gelangt:

perl ist nicht unlogisch, es ist einfach nur "anders" - aber in vielen Fällen sehr viel flexibler als andere Programmiersprachen.




Ich habe auch mal Finnisch gelernt. Das ist auch eine Sprache, in der alles "anders" ist - aber sicher nicht unlogisch 8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#12
Es geht übrigens noch kürzer:



sub SetFHEMMode {
  my $NewMode = shift;
  fhem("set FHEMMode ".($NewMode ne 'Auto') ? $NewMode : isday("CIVIL") ? "Day" : "Night");
}


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

Thorsten Pferdekaemper

Hi,
wenn man jetzt noch die Variablennamen kürzt, dann wird es noch weniger...
Zu dem Teil hier:

sub SetFHEMMode {
  my $NewMode = shift;

Da ist mir doch etwas zu viel "implizit".
Gruß,
   Thorsten
FUIP

betateilchen

Zitat von: Thorsten Pferdekaemper am 21 Februar 2017, 14:00:12
wenn man jetzt noch die Variablennamen kürzt, dann wird es noch weniger...

Hab ich doch schon längst gemacht.

Zitat von: Thorsten Pferdekaemper am 21 Februar 2017, 14:00:12
Da ist mir doch etwas zu viel "implizit".

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