多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > Perl 標量上下文中如何得到列表

Perl 標量上下文中如何得到列表

來源:程序員人生   發(fā)布時間:2015-05-07 10:03:25 閱讀次數(shù):4510次

本文由帖子《perl標量上下文和列表上下文的1個問題》整理而來,說明了為何在某些情況下,標量上下文中使用”列表“沒法得到本身元素的個數(shù),和如何取得你所期望的結(jié)果。


1. “列表”在標量上下文中并不是1定會得到元素的個數(shù)

也許你覺得這個標題有1些奇怪:依照Perl 上下文的定義,列表在標量上下文中會得到列表元素的個數(shù)。單純通過這個邏輯來看,下面的語句似乎會讓$scalar 被賦值3:

$scalar = qw/a b c/;
但是Perl 總會在1些不起眼的地方強行給你1個大欣喜,如果你打印$scalar 的值,你會發(fā)現(xiàn)你得到的是"c"而非"3"。


2. 為何可以被稱為真諦的上下文規(guī)則“失效”了

似乎對非Perl 程序員,說明這個問題要簡單許多。為了理解為何上下文規(guī)則在這里“失效”了,我們必須拋開“列表在標量上下文中會得到列表元素的個數(shù)”這樣1個看似是真諦的結(jié)論,而從語言本身再去看待這個問題。

依然是這條語句

$scalar = qw/a b c/;
Perl 中所有的qw 運算符都會被展開成列表情勢,所以這條語句和下1條完全等價:

$scalar = ('a', 'b', 'c',);
固然這兩條語句都會把$scalar 賦值為"c"。

下面讓我們忘掉上下文規(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條語句:

$scalar = scalar qw/a b c/;
如果你開始以Perl 的眼睛來看代碼,你就會明白上面的語句和下1條語句等價:

$scalar = scalar 'c';
天經(jīng)地義,你得到的依然是"c" 而非"3"。


3. 我們所熟知的Perl 真諦難道是謬論嗎?

對Perl 程序員有1個信條:上下文規(guī)則即是絕對的真諦。由于這條規(guī)則就是Perl 的思考方式,正確性無可置疑。

固然,這條真諦在上面的語句中依然有效。

之所以會帶來上下文規(guī)則失效了的錯覺,是由于我們常常習慣以自己的眼睛而非Perl 的眼睛去看代碼。剛才在解釋$scalar 為何會得到'c' 的時候,我們也間接地表達了1個事實,在語句

$scalar = qw/a b c/; $scalar = ('a', 'b', 'c',); $scalar = scalar qw/a b c/;
乃至是語句
$scalar = scalar ('a', 'b', 'c',);
中,都不存在任何列表

上下文規(guī)則不可能出錯,列表在標量上下文中返回的永久都是列表中元素的個數(shù),但是在我們前面寫的所有語句中,的確不曾出現(xiàn)過任何1個列表。


4. 如何在標量上下文中使用列表

如果想這樣做,方法就是顯式的告知Perl 賦值號右側(cè)是1個列表而非逗號表達式:

$scalar = @{ ['a', 'b', 'c',] };
其中賦值號右側(cè)的方括號告知Perl 這是1個匿名列表的援用,而@{$aref} 則是列表的解援用情勢,所以賦值號右側(cè)我們得到了1個列表"('a', 'b', 'c')", 而非逗號表達式"('a', 'b', 'c')"。而根據(jù)上下文規(guī)則,列表在標量上下文中會得到列表元素的個數(shù)。天經(jīng)地義$scalar 被賦值為3。

回過頭來,讓我們看另外一條語句:

@array = qw/a b c/;
根據(jù)qw 展開規(guī)則,這條語句和下面1條語句等價:

@array = ('a', 'b', 'c',);

賦值號左側(cè)是1個列表,所以這條語句是1個列表上下文,Perl 會在列表上下文中將賦值號的右側(cè)理解為1個列表"('a', 'b', 'c',)" 而非逗號表達式"('a', 'b', 'c',)"。這個不難理解――在列表上下文中天經(jīng)地義Perl 會期望1個列表,而在標量上下文中天經(jīng)地義Perl 會期望1個標量。所以相同的表達式

('a', 'b', 'c',)
會在標量上下文中被當作1個逗號表達式,而在列表上下文中被認為是1個列表。Perl 只是在尋覓它期望得到的東西。


5. 去理解Perl 而非讓Perl 理解你

這件事是2 年前自己學Perl 的時候也非常不解的1件事,在查閱了很多資料后才理解為何我的代碼會這樣運作。我覺得這也是1個Perl 程序員所必須經(jīng)歷的1個轉(zhuǎn)變:

Perl 和其他語言有些不同――寫Perl 的時候需要用Perl 的思惟去思考,你需要理解Perl,而非讓Perl 去理解你的代碼。


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国内精品久久久久久久亚洲 | 午夜老司机永久免费看片 | 亚洲第一免费网站 | 波多野结衣资源在线观看 | 国产色在线 | 亚洲 国产色综合久久无码有码 国产色综合一区二区三区 国产上床视频 | 亚洲午夜久久久久国产 | 国产福利一区二区三区在线视频 | 欧美日韩在线精品成人综合网 | 欧美日韩在线永久免费播放 | 偷柏自拍亚洲欧美综合在线图 | 欧美一区二区三区综合色视频 | 成人影院久久久久久影院 | 亚洲精品一区 | 成人亚洲综合 | xx综合网 | 一级毛片免费 | 视频在线网站 | 亚洲欧美日韩综合一区 | 日本特级aⅴ一级毛片 | 在线观看视频高清视频 | 亚洲国产高清视频在线观看 | 欧美性生交xxxxx久久久 | 欧美日韩第三页 | 中文字幕亚洲欧美 | 免费观看性欧美毛片 | 亚洲精品一区二区观看 | 一本大道道无香蕉综合在线 | h视频免费观看 | 老妇女人一级毛片 | 性生生活三级视频观看 | 欧美成人午夜在线全部免费 | 日韩字幕无线乱码 | 亚洲国产高清人在线 | 9久热久爱免费精品视频在线观看 | 自拍偷拍二区 | 国产一二三区在线观看 | 亚洲制服另类 | 中文字幕a∨在线乱码免费看 | 亚洲色中文字幕在线播放 | 欧美一级特毛片 | 亚洲fuli在线观看 |