我的程序中的這段Perl代碼給出了錯誤的結果。Perl中的賦值三元條件運算符問題
$condition ? $a = 2 : $a = 3 ;
print $a;
無論$condition
的值是多少,輸出總是3,怎麼回事?
我的程序中的這段Perl代碼給出了錯誤的結果。Perl中的賦值三元條件運算符問題
$condition ? $a = 2 : $a = 3 ;
print $a;
無論$condition
的值是多少,輸出總是3,怎麼回事?
這在Perl的documentation解釋。
由於Perl運算符優先級的語句被解析爲
($condition ? $a= 2 : $a) = 3 ;
因爲:操作者產生一個可分配的結果,3分配給的條件的結果。
當$條件爲真此裝置($ a = 2)= 3給予$ a = 3
當$條件爲假此裝置($ A)= 3給予$ a = 3
寫這個正確的方法是
$a = ($condition ? 2 : 3);
print $a;
我們得到了這個工作咬傷,所以我在這裏發帖,希望其他人會發現它很有用。
只是爲了延續之前的答案...如果,無論出於何種原因,該分配需要是有條件的部分,你想把它正是如此寫:
$condition ? ($a=2) : ($a=3);
這將是如果有用的話您正在根據條件分配不同的變量。
$condition ? ($a=2) : ($b=3);
如果你選擇的變量,但不管如何分配同樣的事情,你甚至可以做到這一點:
($condition ? $a : $b) = 3;
建議之一以上Tithonium的回答是:
如果你想爲不同的值賦給同一個變量,這可能會更好(拷貝書的方式):
$ a =($條件)? 2:3;
一旦你有,你可以從優先級問題,是患了端倪,一招弄清楚什麼的Perl以爲你的意思是:
perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;'
在你的情況下,會告訴你:
(($condition ? ($a = 2) : $a) = 3);
print($a);
-e syntax OK
......在這一點上,你應該說「哦,解釋它」!
由於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);
}
「當$條件爲真,這意味着$ a = 2 = 3給予$ A = 3」 我會想到$ a = 2 = 3將是一個表達式語法錯誤或左值所需錯誤或這些......究竟如何得到評估? – sundar 2008-10-11 13:08:43
你是對的我會修改它是($ a = 2)= 3而不是$ a = 2 = 3 – Pat 2008-10-13 13:02:04