2008-08-12 12 views

Antwort

80

Dies wird in der Perl documentation erklärt.

Wegen des Vorrangs Perl Operators der Aussage als

($condition ? $a= 2 : $a) = 3 ; 

analysiert wird, weil der Operator?: Ein frei belegbare Ergebnis führt, 3 mit dem Ergebnis der Bedingung zugewiesen.

Wenn $ Bedingung ist wahr, bedeutet dies ($ a = 2) = 3 geben $ a = 3

Wenn $ Bedingung falsch ist dieses Mittel ($ a) = 3 geben $ a = 3

der richtige Weg, dies zu schreiben, ist

$a = ($condition ? 2 : 3); 
print $a; 

wir damit bei der Arbeit gebissen habe, so dass ich bin Entsendung hier andere hoffen, wird es nützlich finden.

+1

"Wenn $ Bedingung erfüllt ist, bedeutet dies $ a = 2 = 3 geben $ a = 3" Ich würde einen Ausdruck Syntaxfehler oder L-Wert erforderlich Fehler oder so gedacht haben $ a = 2 = 3 wäre ... Wie genau wird es bewertet? – sundar

+0

Sie haben Recht, ich werde es ändern es ist ($ a = 2) = 3 statt $ a = 2 = 3 – Pat

21

einfach die vorherige Antwort erweitern ... Wenn aus welchem ​​Grund auch immer, müssen die Zuordnungen Teil der bedingten sein, möchten Sie würde es schreiben thusly:

$condition ? ($a=2) : ($a=3); 

Dies würde nützlich sein, wenn Sie ordnen basierend auf der Bedingung verschiedenen Variablen zu.

$condition ? ($a=2) : ($b=3); 

Und wenn Sie die Variable Wahl sind, aber die gleiche Sache zuweisen, egal was, könnte man sogar dies tun:

($condition ? $a : $b) = 3; 
0

Ein Vorschlag zu Tithonium Antwort oben:

Wenn Wenn Sie der gleichen Variablen unterschiedliche Werte zuweisen möchten, ist dies möglicherweise besser (das Kopieren im Buch):

$ a = ($ bedingung)? 2: 3;

40

Sobald Sie eine Ahnung davon haben, dass Sie von den Vorrang Problemen leiden könnte, ein Trick, um herauszufinden, was Perl haben Sie gemeint:

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;' 

In Ihrem Fall, dass ich Ihnen zeigen:

(($condition ? ($a = 2) : $a) = 3); 
print($a); 
-e syntax OK 

... an diesem Punkt sollten Sie sagen "Oh, das erklärt es"!

+0

Deparse ist eine sehr nette Partei Trick. Natürlich, sobald Sie ein Präzedenzfall-Problem vermuten, sind Sie meist den größten Teil der Lösung ;-) – RET

4

Wegen des Vorrangs Perl Operator die Anweisung analysiert wird als:

($condition ? $a = 2 : $a) = 3 ; 

Da der Operator?: Erzeugt einen zuweisbaren Ergebnis wird 3 zu dem Ergebnis der Bedingung zugewiesen.

Wenn $ Bedingung erfüllt ist, bedeutet dies $ a = 2 = 3 geben $ a = 3

Wenn $ Bedingung falsch ist dies bedeutet, a $ = 3 geben $ a = 3

Die richtige Art und Weise zu schreiben dies

$a = $condition ? 2 : 3; 

im allgemeinen sollten Sie wirklich aus der Gewohnheit conditionals der Verwendung Zuordnung zu tun, wie im ursprünglichen Beispiel - es ist die Art von Dingen, die einen guten Ruf bekommen für sein schreiben in Perl führt -nur.

Eine gute Faustregel ist, dass Bedingungen nur für einfache Werte, nie Ausdrücke mit Nebenwirkungen sind. Wenn Sie oder jemand anders diesen Code in acht Monaten lesen muss, würden Sie es lieber so lesen?

$x < 3 ? foo($x) : bar($y); 

Oder so?

if ($x < 3) { 
    $foo($x); 
} else { 
    $bar($y); 
}