Hauptmenü

else {if oder elsif (

Begonnen von Navigator, 22 Mai 2014, 17:17:40

Vorheriges Thema - Nächstes Thema

Navigator

In den meisten Wiki´s zu FHEM werden verschachtelte Anweisungen nach der Syntax else {if abgearbeitet. Nun arbeite ich mich bei 30 Grad durch mein kleines Perl Kompendium und schreibe meine ersten kleinen Scripte, jedoch treu dem Buch nach dem Schema elsif (. Was ist denn nun vor allem in Bezug auf FHEM zu bevorzugen. Persönlich habe ich mich jetzt schon an erstere Variante gewöhnt, muss aber sagen das ich letztere von der Klammersetzung fast übersichtlicher finde.
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

betateilchen

Kannst Du machen, wie Du möchtest. Für Anfänger ist die erste Variante leichter zu verstehen, für Fortgeschrittene ist die zweite Variante übersichtlicher.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Puschel74

#2
Hallo,

ist nicht der Unterschied der das sich bei

else {if
das if einen eigenen Teil darstellt und mit dem if...else nichts zu tun hat und das else bezieht sich das vorhergehende if  und bei

elsif (
wird sich nur auf das vorhergehende if bezogen?

mMn sind das 2 unterschiedliche Codes die so nichts miteinander zu tun haben (und auch nicht austauschbar sind).

Grüße

Edith: Ich such noch nach einem Beispiel um meinen Gedankengang verdeutlichen zu können  8)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fhainz

#3
Sehe ich wie Puschel. Die beiden codes machen nicht das gleiche.

Ein weiterer Unterschied ist das man mehrere elsif(){} haben kann, aber nur ein else{}


if( $a == 1 ){
}
elsif( $b == 1 ){
}
elsif( $c == 1 ){
  if( $d == 1 ){
  }
  else{
  }
}
else{
}


Grüße



Elektrolurch

if
elsif
elsif
elsif
else

macht dann der Übersicht halber dann Sinn, wenn Du für ein und die selbe Variable eine Liste von verschiedenen Werten abarbeiten möchtest und das letzte else ist dann das default, z.B. wenn die Eingabe überhaupt nicht passte ... usw.

configDB und Windows befreite Zone!

Navigator

Ich glaube ich weiß was du sagen willst Puschel, deswegen auch die verschiedenen Schreibweisen mit Einrückung. Da mein Mini Begrüßungsscript aber immer die gleiche Variable abruft, sollte die Schreibweise hier egal sein und ist in ersterer Variante deutlich leichter zu lesen.



#######Zufallsbegruessung############################
sub
Begruessung
{
my $zufallszahl;
$zufallszahl=int(rand(12));
if ($zufallszahl == 0) {fhem ("set MyTTS tts Hallo")}
elsif ($zufallszahl == 1) {fhem ("set MyTTS tts Hey.")}
elsif ($zufallszahl == 2) {fhem ("set MyTTS tts Willkommen.")}
elsif ($zufallszahl == 3) {fhem ("set MyTTS tts Wie gehts?")}
elsif ($zufallszahl == 4) {fhem ("set MyTTS tts Schön dich zu sehen.")}
elsif ($zufallszahl == 5) {fhem ("set MyTTS tts Wieder zurück?")}
elsif ($zufallszahl == 6) {fhem ("set MyTTS tts Wie war Dein Tag?")}
elsif ($zufallszahl == 7) {fhem ("set MyTTS tts Jetzt am besten eine schöne Tasse Kaffee.")}
elsif ($zufallszahl == 8) {fhem ("set MyTTS tts Endlich die Beine hochlegen.")}
elsif ($zufallszahl == 9) {fhem ("set MyTTS tts Zu Hause ists doch am schönsten.")}
elsif ($zufallszahl == 10) {fhem ("set MyTTS tts Freue mich dich zu sehen.")}
elsif ($zufallszahl == 11) {fhem ("set MyTTS tts Hi.")}
elsif ($zufallszahl == 12) {fhem ("set MyTTS tts Hier ist deine Hausnutte.")}
}



sub
Begruessung
{
my $zufallszahl;
$zufallszahl=int(rand(12));
if ($zufallszahl == 0) {fhem ("set MyTTS tts Hallo")}
else {if($zufallszahl == 1) {fhem ("set MyTTS tts Hey.")}
else {if($zufallszahl == 2) {fhem ("set MyTTS tts Willkommen.")}
else {if($zufallszahl == 3) {fhem ("set MyTTS tts Wie gehts?")}
else {if($zufallszahl == 4) {fhem ("set MyTTS tts Schön dich zu sehen.")}
else {if($zufallszahl == 5) {fhem ("set MyTTS tts Wieder zurück?")}
else {if($zufallszahl == 6) {fhem ("set MyTTS tts Wie war Dein Tag?")}
else {if($zufallszahl == 7) {fhem ("set MyTTS tts Jetzt am besten eine schöne Tasse Kaffee.")}
else {if($zufallszahl == 8) {fhem ("set MyTTS tts Endlich die Beine hochlegen.")}
else {if($zufallszahl == 9) {fhem ("set MyTTS tts Zu Hause ists doch am schönsten.")}
else {if($zufallszahl == 10) {fhem ("set MyTTS tts Freue mich dich zu sehen.")}
else {if($zufallszahl == 11) {fhem ("set MyTTS tts Hi.")}
else {if($zufallszahl == 12) {fhem ("set MyTTS tts Hier ist deine Hausnutte.")}
                                                                                            }
                                                                                          }
                                                                                 }
                                                                        }
                                                               }
                                                       }
                                              }
                                      }
                               }
                        }
                 }
         }
}
                       
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

fhainz

#6
Mich wundert das deine 2. Version überhaupt klappt. Muss wohl eine Eigenheit in Perl sein das mehrere else Zweige nicht in einem Fehler enden.

http://perlmeme.org/howtos/syntax/ifelsifelse.html

Navigator

Hallo fheinz.

Mit letzterer Variante hab ich bis jetzt alle Notifys basteln können, eigentlich ist die neue Methode meine erste Modulation in den 99_myUtils.
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

Puschel74

Hallo,

@Dittel
Danke für dein Beispiel  ::)
Manches liegt so nah  ;D

sub
Begruessung
{
my $zufallszahl;
my $buchstabe;
$zufallszahl=int(rand(12));
$buchstabe=A;
if ($zufallszahl == 0) {fhem ("set MyTTS tts Hallo")}
  else {if($zufallszahl == 1) {fhem ("set MyTTS tts Hey.")}
  else {if($buchstabe == A) {fhem ("set MyTTS Zufallszahl ist nicht 0 oder 1 aber Buchstabe ist A.")
}

Das hat mit den Einrückungen nichts zu tun.

An meinem von dir geklauten abgewandelten Beispiel siehst du das das letzte else zuschläft wenn $Zufallszahl ungleich 0 oder ungleich1 ist aber zusätzlich noch geprüft wird ob Buchstabe gleich A.
Ja ich weiß - auch ein blödes Beispiel.
Ich grübel immer noch nach einem vernüftigen.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

betateilchen

Ihr habt ja alle recht. Aber ich auch.

Es gibt nämlich durchaus Fälle, wo in beiden Syntaxanwendungen das Gleiche rauskommt. So ganz genau war die Fragestellung ja nicht formuliert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fhainz

Hab nochmal genauer hingesehen und für mich korrekt eingerückt.

Du schachtelst deinen code immer weiter, deswegen klappt das mit den ganzen else. Ich denke nicht das das sehr performant ist, oder belehrt mich eines besseren :P


if ($zufallszahl == 0) {
  fhem ("set MyTTS tts Hallo")
}
else {
  if($zufallszahl == 1) {
    fhem ("set MyTTS tts Hey.")
  }
  else {
    if($zufallszahl == 2) {
      fhem ("set MyTTS tts Willkommen.")
    }
    else {
      if($zufallszahl == 3) {
        fhem ("set MyTTS tts Wie gehts?")
      }
      else {
        if($zufallszahl == 4) {
          fhem ("set MyTTS tts Schön dich zu sehen.")
        }
else {
          if($zufallszahl == 5) {
            fhem ("set MyTTS tts Wieder zurück?")
          }
  else {
            if($zufallszahl == 6) {
              fhem ("set MyTTS tts Wie war Dein Tag?")
            }
            ......


Meiner Meinung nach bist du auch in Sachen Geschwindigkeit mit elseif() besser dran.

Grüße

Navigator

Naja, das mit dem Einrücken muss ich noch üben, aber ob nun die letztere Variante eher System belastendender ist, kann ich nicht sagen, würde mich aber doch mal genauer interessieren. Allerdings hat hier wohl niemand mehr nen C64 stehen.
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

Puschel74

Hallo,

else {if
ermöglicht eine neue if-Abfrage die mit dem einleitenden if nichts zu tun haben muss während sich
elsif
auf das einleitende if bezieht.

So. Nun hab ichs.

Grüße

Edith:
ZitatAllerdings hat hier wohl niemand mehr nen C64 stehen.
Ich habe meinen 1990 durch einen Amiga500 ersetzt  ::)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Navigator

#13
Ich glaub ich habs begriffen. Danke an alle.  :)
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.

Puschel74

Hallo,

dann wie gehabt ...

Beitrag als Gelöst markieren  ;)
Danke.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.