Autor Thema: Reihenfolge bei mehreren elsif-Zweigen  (Gelesen 537 mal)

Offline KölnSolar

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5093
Reihenfolge bei mehreren elsif-Zweigen
« am: 15 Februar 2021, 14:26:00 »
Hi,

kann es sein, dass Perl nicht die codierte Reihenfolge bei Perl-elsif berücksichtigt ?

Bsp.
        if ($temp > 0 ) { # above 0
if ($temp > 3 )      {...} # above 3
elsif    ($temp < 1 ) {...} # between 0/1
elsif    ($temp < 2 ) {...}          # between 0/2 or between 1/2 ?????? not clearly defined ?
        else {...}                      # between 2/3
}          # below 0
Ich meine bei mir einen Fall gesehen zu haben, wo ein Wert=0,5 nicht den $temp < 1 Zweig, sondern den nachfolgenden $temp < 2 Zweig durchlaufen hat. Das hiesse, dass man obiges Bsp. so umsetzen müsste        if ($temp > 0 ) {           # above 0
if ($temp > 3 )      {...} # above 3
elsif    ($temp < 2 ) {                    # between 0/2
     if    ($temp < 1 ) {...}         # between 0/1
                } 
        else {...}                # between 2/3
}               # below 0
Fänd ich persönlich unübersichtlicher.

Grüße Markus
« Letzte Änderung: 15 Februar 2021, 14:42:31 von KölnSolar »
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Offline Christoph Morrison

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1615
Antw:Reihenfolge bei mehreren elsif-Zweigen
« Antwort #1 am: 15 Februar 2021, 14:32:57 »
Was genau ist denn in $temp und $vltemp?

Offline KölnSolar

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5093
Antw:Reihenfolge bei mehreren elsif-Zweigen
« Antwort #2 am: 15 Februar 2021, 14:47:31 »
Sorry,
natürlich nur $temp. (Wenn man es anderen leicht machen will, macht man es auch noch komplizierter).  ::)
Ich habs oben korrigiert. Ich denke nun stellt sich Deine Verständnisfrage nicht mehr ?
(in meinem konkreten Fall wird der Wert an eine sub übergeben u. dort so aufgelöst: my ($temp) = @_; )
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Online Wernieman

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7324
Antw:Reihenfolge bei mehreren elsif-Zweigen
« Antwort #3 am: 15 Februar 2021, 14:50:22 »
Also laut Definition (und bisher):

if xxx
  elsif xxx
    elsif xxx
    else xxx

Eigentlich war ursprünglich ein elsif auch die Kurschreibung für "else if"

Also wäre es ein Bug, wenn es anstatt des 1. Zweiges den 2. machen würde
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Offline Christoph Morrison

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1615
Antw:Reihenfolge bei mehreren elsif-Zweigen
« Antwort #4 am: 15 Februar 2021, 17:19:06 »
use strict;
use experimental qw( switch );
use feature 'say';

sub to_test {
    my ($temp) = @_;    #  eher schlecht

    if ($temp > 0 ) { # above 0
        if      ($temp > 3 ) { return q(above 3 but not 3); } # above 3
        elsif   ($temp < 1 ) { return q(below 1 but not above 3); } # between 0/1
        elsif   ($temp < 2 ) { return q(below 2 but not above 3); }          # between 0/2 or between 1/2 ?????? not clearly defined ?
        else    { return q(literal 2 or above 3); }                      # between 2/3
    }          # below 0

    return q(literal 0 or below);
}

my @values = qw( 0 0.5 1 1.5 2 2.5 3 3.5 0.1 -3 -10 -20_000 a b 12c c12 foo 0,5 );

for my $test_value (@values) {
    say "Value $test_value is " . to_test($test_value);
}

ergibt

Value 0 is literal 0 or below
Value 0.5 is below 1 but not above 3
Value 1 is below 2 but not above 3
Value 1.5 is below 2 but not above 3
Value 2 is literal 2 or above 3
Value 2.5 is literal 2 or above 3
Value 3 is literal 2 or above 3
Value 3.5 is above 3 but not 3
Value 0.1 is below 1 but not above 3
Value -3 is literal 0 or below
Value -10 is literal 0 or below
Value -20_000 is literal 0 or below
Value a is literal 0 or below
Value b is literal 0 or below
Value 12c is above 3 but not 3
Value c12 is literal 0 or below
Value foo is literal 0 or below
Value 0,5 is literal 0 or below

Ich überlege noch, was davon unerwartet ist.

Online zap

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3730
    • HMCCU
Antw:Reihenfolge bei mehreren elsif-Zweigen
« Antwort #5 am: 22 Februar 2021, 16:48:06 »
Wenn Perl kein Interpreter wäre, hätte ich gesagt, der Compiler hat den Code nach eigenem Gutdünken optimiert.
2xCCU3, diverse Komponenten (Fenster, Rolladen, Themostate, Stromzähler, Steckdosen ...)
FHEM mit Raspi für CCU Integration.
IOBroker für UI (VIS), Hue, Sonos usw.
Maintainer der Module FULLY, Meteohub und HMCCU (Schnittstelle CCU-FHEM = best of both worlds approach

Online Wernieman

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7324
Antw:Reihenfolge bei mehreren elsif-Zweigen
« Antwort #6 am: 22 Februar 2021, 17:08:11 »
Ich "sehe" jetzt den Fehler nicht ... bin ich "blind"?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html