Thread 'return' und 'or': Operatorenrangfolge (12 answers)
Opened by Crian at 2005-02-07 17:49

Crian
 2005-02-07 17:49
#51570 #51570
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich hab eine ganze Weile an einem Problem gesessen, bis ich es auf dieses hier zurückführen konnte:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl
use strict;
use warnings;

sub vergleiche1 ($$) {
   my ($aa, $bb) = @_;
   print "1: aa = '$aa', ", length($aa), "\1: nbb = '$bb', ", length($bb), "\n";
   print "1: aa ist leer\n" if $aa eq '';
   print "1: bb ist leer\n" if $bb eq '';
   return $aa eq '' or
          $bb eq '' or
          $aa eq $bb;
};

sub vergleiche2 ($$) {
   my ($aa, $bb) = @_;
   print "2: aa = '$aa', ", length($aa), "\n2: bb = '$bb', ", length($bb), "\n";
   print "2: aa ist leer\n" if $aa eq '';
   print "2: bb ist leer\n" if $bb eq '';
   return $aa eq '' ||
          $bb eq '' ||
          $aa eq $bb;
};

sub vergleiche3 ($$) {
   my ($aa, $bb) = @_;
   print "3: aa = '$aa', ", length($aa), "\n3: bb = '$bb', ", length($bb), "\n";
   print "3: aa ist leer\n" if $aa eq '';
   print "3: bb ist leer\n" if $bb eq '';
   return ($aa eq ''  or
           $bb eq ''  or
           $aa eq $bb   );
};


{
   my $eins = 'blubb';
   my $zwei = '';

   print "TEST EINS\n";
   my $t1 = vergleiche1($eins, $zwei);
   print "Ergebnis: [$t1]\n\n";

   print "TEST ZWEI\n";
   my $t2 = vergleiche2($eins, $zwei);
   print "Ergebnis: [$t2]\n\n";

   print "TEST DREI\n";
   my $t3 = vergleiche3($eins, $zwei);
   print "Ergebnis: [$t3]\n\n";

}


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TEST EINS
1: aa = '', 0
1: bb = 'blubb', 5
1: aa ist leer
Ergebnis: []

TEST ZWEI
2: aa = '', 0
2: bb = 'blubb', 5
2: aa ist leer
Ergebnis: [1]

TEST DREI
3: aa = '', 0
3: bb = 'blubb', 5
3: aa ist leer
Ergebnis: [1]


Belegt man $eins und $zwei andersherum, so ist das Ergebnis in allen drei Fällen '1'.

Deshalb funktioniert es manchmal so wie es soll, manchmal auch nicht.

Das Problem ist wohl, dass return stärker bindet als or!

Und das finde ich ziemlich eigenartig. welchen Sinn kann es wohl haben, return stärker als irgendwas anderes binden zu lassen? Welcher Ausdruck hinter dem return würde denn Sinn machen, wenn er dort stehen bliebe?

Es wurde leider auch nicht gewarnt, dass der Code hinter return $aa eq '' nicht ausgeführt wurde.


Dies Beispiel soll zur Warnung dienen, damit so schnell kein anderer in diese Falle tritt.

Zum Glück hat man bei Perl ja nur ganz selten mal so einen Fall, wo man mit Intuition einfach genau daneben liegt.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite

View full thread 'return' und 'or': Operatorenrangfolge