FHEM Forum

FHEM - Entwicklung => FHEM Development => Perl Ecke => Thema gestartet von: KölnSolar am 15 Februar 2021, 14:26:00

Titel: Reihenfolge bei mehreren elsif-Zweigen
Beitrag von: KölnSolar 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
Titel: Antw:Reihenfolge bei mehreren elsif-Zweigen
Beitrag von: Christoph Morrison am 15 Februar 2021, 14:32:57
Was genau ist denn in $temp und $vltemp?
Titel: Antw:Reihenfolge bei mehreren elsif-Zweigen
Beitrag von: KölnSolar 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) = @_; )
Titel: Antw:Reihenfolge bei mehreren elsif-Zweigen
Beitrag von: Wernieman 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
Titel: Antw:Reihenfolge bei mehreren elsif-Zweigen
Beitrag von: Christoph Morrison 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.
Titel: Antw:Reihenfolge bei mehreren elsif-Zweigen
Beitrag von: zap 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.
Titel: Antw:Reihenfolge bei mehreren elsif-Zweigen
Beitrag von: Wernieman am 22 Februar 2021, 17:08:11
Ich "sehe" jetzt den Fehler nicht ... bin ich "blind"?