FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Navigator am 22 Mai 2014, 17:17:40

Titel: else {if oder elsif (
Beitrag von: Navigator am 22 Mai 2014, 17:17:40
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.
Titel: Antw:else {if oder elsif (
Beitrag von: betateilchen am 22 Mai 2014, 17:24:27
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.
Titel: Antw:else {if oder elsif (
Beitrag von: Puschel74 am 22 Mai 2014, 17:28:53
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)
Titel: Antw:else {if oder elsif (
Beitrag von: fhainz am 22 Mai 2014, 17:38:16
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


Titel: Antw:else {if oder elsif (
Beitrag von: Elektrolurch am 22 Mai 2014, 17:52:58
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.

Titel: Antw:else {if oder elsif (
Beitrag von: Navigator am 22 Mai 2014, 18:42:15
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.")}
                                                                                            }
                                                                                          }
                                                                                 }
                                                                        }
                                                               }
                                                       }
                                              }
                                      }
                               }
                        }
                 }
         }
}
                       
Titel: Antw:else {if oder elsif (
Beitrag von: fhainz am 22 Mai 2014, 18:44:51
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
Titel: Antw:else {if oder elsif (
Beitrag von: Navigator am 22 Mai 2014, 18:49:18
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.
Titel: Antw:else {if oder elsif (
Beitrag von: Puschel74 am 22 Mai 2014, 18:51:08
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
Titel: Antw:else {if oder elsif (
Beitrag von: betateilchen am 22 Mai 2014, 18:53:40
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.
Titel: Antw:else {if oder elsif (
Beitrag von: fhainz am 22 Mai 2014, 18:58:39
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
Titel: Antw:else {if oder elsif (
Beitrag von: Navigator am 22 Mai 2014, 19:04:37
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.
Titel: Antw:else {if oder elsif (
Beitrag von: Puschel74 am 22 Mai 2014, 19:08:17
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  ::)
Titel: Antw:else {if oder elsif (
Beitrag von: Navigator am 22 Mai 2014, 19:09:45
Ich glaub ich habs begriffen. Danke an alle.  :)
Titel: Antw:else {if oder elsif (
Beitrag von: Puschel74 am 22 Mai 2014, 20:09:26
Hallo,

dann wie gehabt ...

Beitrag als Gelöst markieren  ;)
Danke.

Grüße