Reihenfolge bei mehreren elsif-Zweigen

Begonnen von KölnSolar, 15 Februar 2021, 14:26:00

Vorheriges Thema - Nächstes Thema

KölnSolar

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
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

Christoph Morrison

Was genau ist denn in $temp und $vltemp?

KölnSolar

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

Wernieman

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

Christoph Morrison


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.

zap

Wenn Perl kein Interpreter wäre, hätte ich gesagt, der Compiler hat den Code nach eigenem Gutdünken optimiert.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

Wernieman

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