Problem mit Ternärem Operator

27/11/2008 - 13:05 von Michael Hentsch | Report spam
Hallo zusammen,

ich habe gerade erst begonnen Perl zu programmieren, also kann es gut
sein, dass ich mich mit meiner Frage jetzt total blamiere, ich stehe
aber total auf dem Schlauch und möchte es gern verstehen.

Es geht um den Ternàren Operator. Ich möchte diesen benutzen, um
Singular und Plural für eine Ausgabe zu unterscheiden.

Hier ein kurzes Programm zur Verdeutlichung meines Problems:

<--
#!/usr/bin/perl -w

use strict;

my $string_1;
my $string_2;
my $number = 1;

# Test 1:
($number == 1) ? $string_1 .= "1" : $string_1 .= ">1";

print "$string_1";

# Test 2:
($number == 1) and $string_2 .= "1" or $string_2 .= ">1";

print "$string_2";

Ich würde nun erwarten, dass der Inhalt von $string_1 in Test 1 auch "1"
ist. Es werden aber beide Ausdrücke berechnet und der Inhalt ist "1>1".

Schreibe ich den betreffenden Teil nun um, also

if ($number == 1) {
$string_1 .= "1";
} else {
$string_1 .= ">1";
}

dann funktioniert es wie erwartet, $string_1 hat den Wert "1".

Mit Test 2 funktioniert es auch und ich erhalte in $string_2 wie
erwartet "1".

Nun meine Frage dazu: Was passiert bei Test 1? Mache ich da einen
Denkfehler? Warum bekomme ich unter Verwendung des Ternàren Operators
nicht das erwartete Ergebnis (1)?
(Ja, ok, das waren gleich drei Fragen ;-))

Vielen Dank

Michi
 

Lesen sie die antworten

#1 Achim Peters
27/11/2008 - 13:44 | Warnen spam
Michael Hentsch schrieb:
Es geht um den Ternàren Operator. Ich möchte diesen benutzen, um
Singular und Plural für eine Ausgabe zu unterscheiden.

Hier ein kurzes Programm zur Verdeutlichung meines Problems:

($number == 1) ? $string_1 .= "1" : $string_1 .= ">1";



Da fehlen Klammern um die Zuweisungen. Deins wird geparst zu

( ($number == 1) ? ($string_1 .= "1") : $string_1 ) .= ">1";

("Programming Perl" 3rd ed., S.106)

So geht's, wie Du es Dir denkst:

($number == 1) ? ($string_1 .= "1") : ($string_1 .= ">1");

Dass der ternàre Operator (nicht nur in Perl) aber "eigentlich" dazu da
ist, einen Wert zu liefern, und nicht, um eine Zuweisung auszuführen,
weisst Du?

Ich hàtte also sowas erwartet:

$string_1 .= ($number == 1) ? "1" : ">1";

HTH

Bye
Achim

Ähnliche fragen