FHEM - Entwicklung > Perl Ecke

Reihenfolge bei mehreren elsif-Zweigen

(1/2) > >>

KölnSolar:
Hi,

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

Bsp.

--- Code: ---        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
--- Ende Code ---
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
--- Code: ---        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
--- Ende Code ---
Fänd ich persönlich unübersichtlicher.

Grüße Markus

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) = @_; )

Wernieman:
Also laut Definition (und bisher):


--- Code: ---if xxx
  elsif xxx
    elsif xxx
    else xxx

--- Ende Code ---

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

Christoph Morrison:

--- Code: ---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);
}

--- Ende Code ---

ergibt


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

--- Ende Code ---

Ich überlege noch, was davon unerwartet ist.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln