2008-08-12 49 views

回答

80

這在Perl的documentation解釋。

由於Perl運算符優先級的語句被解析爲

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

因爲:操作者產生一個可分配的結果,3分配給的條件的結果。

當$條件爲真此裝置($ a = 2)= 3給予$ a = 3

當$條件爲假此裝置($ A)= 3給予$ a = 3

寫這個正確的方法是

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

我們得到了這個工作咬傷,所以我在這裏發帖,希望其他人會發現它很有用。

+1

「當$條件爲真,這意味着$ a = 2 = 3給予$ A = 3」 我會想到$ a = 2 = 3將是一個表達式語法錯誤或左值所需錯誤或這些......究竟如何得到評估? – sundar 2008-10-11 13:08:43

+0

你是對的我會修改它是($ a = 2)= 3而不是$ a = 2 = 3 – Pat 2008-10-13 13:02:04

21

只是爲了延續之前的答案...如果,無論出於何種原因,該分配需要是有條件的部分,你想把它正是如此寫:

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

這將是如果有用的話您正在根據條件分配不同的變量。

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

如果你選擇的變量,但不管如何分配同樣的事情,你甚至可以做到這一點:

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

建議之一以上Tithonium的回答是:

如果你想爲不同的值賦給同一個變量,這可能會更好(拷貝書的方式):

$ a =($條件)? 2:3;

40

一旦你有,你可以從優先級問題,是患了端倪,一招弄清楚什麼的Perl以爲你的意思是:

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

在你的情況下,會告訴你:

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

......在這一點上,你應該說「哦,解釋它」!

4

由於Perl運算符優先級的語句被解析爲:

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

因爲:操作者產生一個可分配的結果,3分配給的條件的結果。

當$條件爲真,這意味着$ a = 2 = 3捐贈$ a = 3

當$條件爲假,這意味着$ a = 3捐贈$ a = 3

的正確方法寫這篇文章是

$a = $condition ? 2 : 3; 

在一般情況下,你應該真正走出使用條件語句來做分配,如在原來的例子的習慣 - 這是諸如此類的事情,導致Perl中獲得了聲譽在寫-只要。

一個好的經驗法則是,條件只適用於簡單的值,從來沒有副作用的表達式。當你或其他人需要從現在開始八個月後閱讀此代碼時,你是否更喜歡這樣閱讀?

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

還是這樣?

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