Perl 內建函數在純量語境之下的行爲

作者:   發佈於:  

最近有個同事問我爲什麼這段程式碼的輸出是 "54321" 而不是 "1" 或 "5"。

> perl -E 'say scalar reverse(1,2,3,4,5);'
54321

基本上這個行爲在是有定義在 reverse 的文件當中的,詳見 perldoc reverse

只是,如果你手寫一個函數,回傳一串純量 (list),若沒有額外定義純量語境的行爲,預設的效果就是得到「串列最後一個值」,若回傳一個陣列,則是得到「陣列長度」。

而事實上,內建的函式,多半都有額外定義純量語境之下的行爲,詳見由 @merlyn 整理的這份對照表: http://www.perlmonks.org/index.pl?node_id=347416

而且都不是「串列最後一個值」或「陣列長度」這種效果,多半都是十分不一樣的效果。

某種意義上而言,這應算是種「不一致性」,寫程式時必須要仔細理解才不會被嚇到。 但另一方面,這也算是 perl 「對一小群人展示體貼」(或者反過來說:偏心)的表現吧。

我自己覺得函數能在不同語境之下能定義不同行爲其實是很不錯的,但是選出夠好的「預設行爲」大難題呀。