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
Was genau ist denn in $temp und $vltemp?
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) = @_; )
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
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.
Wenn Perl kein Interpreter wäre, hätte ich gesagt, der Compiler hat den Code nach eigenem Gutdünken optimiert.
Ich "sehe" jetzt den Fehler nicht ... bin ich "blind"?