本文由帖子《perl標量上下文和列表上下文的1個問題》整理而來,說明了為何在某些情況下,標量上下文中使用”列表“沒法得到本身元素的個數(shù),和如何取得你所期望的結(jié)果。
也許你覺得這個標題有1些奇怪:依照Perl 上下文的定義,列表在標量上下文中會得到列表元素的個數(shù)。單純通過這個邏輯來看,下面的語句似乎會讓$scalar 被賦值3:
似乎對非Perl 程序員,說明這個問題要簡單許多。為了理解為何上下文規(guī)則在這里“失效”了,我們必須拋開“列表在標量上下文中會得到列表元素的個數(shù)”這樣1個看似是真諦的結(jié)論,而從語言本身再去看待這個問題。
依然是這條語句
下面讓我們忘掉上下文規(guī)則,通過Perl 的眼睛去看看在這里Perl 看到了甚么:
1. 賦值號以后是1個左括號,而括號是1種優(yōu)先級束縛,括號中的表達式被優(yōu)先計算。
2. 括號中是由1串被逗號隔開的表達式,所以天經(jīng)地義的是1個逗號表達式。
3. 逗號表達式的值是最后1個表達式的值,最后1個表達式是'c',它的值也是'c'。
4. 所以全部逗號表達式的值是'c'
5. 將'c' 賦值給$scalar。
這就是Perl 的眼睛所看到的東西,也是為何$scalar 會被賦值為'c' 的緣由。
所以給你1條語句:
對Perl 程序員有1個信條:上下文規(guī)則即是絕對的真諦。由于這條規(guī)則就是Perl 的思考方式,正確性無可置疑。
固然,這條真諦在上面的語句中依然有效。
之所以會帶來上下文規(guī)則失效了的錯覺,是由于我們常常習慣以自己的眼睛而非Perl 的眼睛去看代碼。剛才在解釋$scalar 為何會得到'c' 的時候,我們也間接地表達了1個事實,在語句
上下文規(guī)則不可能出錯,列表在標量上下文中返回的永久都是列表中元素的個數(shù),但是在我們前面寫的所有語句中,的確不曾出現(xiàn)過任何1個列表。
如果想這樣做,方法就是顯式的告知Perl 賦值號右側(cè)是1個列表而非逗號表達式:
回過頭來,讓我們看另外一條語句:
賦值號左側(cè)是1個列表,所以這條語句是1個列表上下文,Perl 會在列表上下文中將賦值號的右側(cè)理解為1個列表"('a', 'b', 'c',)" 而非逗號表達式"('a', 'b', 'c',)"。這個不難理解――在列表上下文中天經(jīng)地義Perl 會期望1個列表,而在標量上下文中天經(jīng)地義Perl 會期望1個標量。所以相同的表達式
這件事是2 年前自己學Perl 的時候也非常不解的1件事,在查閱了很多資料后才理解為何我的代碼會這樣運作。我覺得這也是1個Perl 程序員所必須經(jīng)歷的1個轉(zhuǎn)變:
Perl 和其他語言有些不同――寫Perl 的時候需要用Perl 的思惟去思考,你需要理解Perl,而非讓Perl 去理解你的代碼。
上一篇 phpcms新增子類后,原分類內(nèi)容找不到了
下一篇 選擇排序