我想執行@a = @b || @c
作業的一些複雜的變化,意圖如果非空(因此在布爾意義上是真的)@b
,否則@c
。該文件明確告訴我我不能。 (它是正確的事實,太多!)爲什麼我不能分配@b ||在Perl中@c到@a?
的 「||」, 「//」 和 「& &」 操作符返回評估 的最後一個值(與C不同的 「||」 和「& & 「,它返回0或1)。
[...]
具體而言,這意味着,你不應該使用這個選擇聚集 兩者之間進行分配:
@a = @b || @c; # this is wrong @a = scalar(@b) || @c; # really meant this @a = @b ? @b : @c; # this works fine, though
不幸的是,它並沒有真正告訴我爲什麼。
我預期會發生的是:
@a =
是一個數組賦值,在右手側誘導列表環境。@b || @c
是右側,在列表上下文中進行評估。||
是C型短路邏輯或。它從左向右評估(如果需要)並傳播上下文。@b
在列表上下文中進行評估。如果爲真(,即,非空),則返回。- 如果不是,
@c
也在列表上下文中進行評估並返回。
顯然,我的倒數第二個陳述是錯誤的。爲什麼?而且,更重要的是,哪部分文檔或來源解釋了這種行爲? PS:在問題的範圍內,我避免使用三元運算符的文檔建議的原因是我的@b
實際上是一個臨時(函數調用結果)。
說「真的意味着這個」的行告訴你爲什麼。 – 2009-08-31 20:46:16
這不僅僅是爲什麼我。但我有偏見。 – 2009-08-31 21:02:57
我寧願將評論「真的意味着這個」改爲「真的意味着這個」。事實上,我期待標量()的變化將@a設置爲等於@b--即作爲作者真正想用的東西 - 顯然並非如此。相反,第一行確實意味着第二行;他們都得到了相同的結果,這不是理想的答案。 – Rini 2009-09-01 15:14:11