我想知道爲什麼Perl有能力參照函數傳遞參數? 我知道Python和Ruby都不具備這樣的功能。爲什麼Perl允許通過引用傳遞參數?
回答
將一件事與另一件區分開很有用。
(1)通過引用將參數傳遞給子程序。這在Perl中很有用,因爲語言將所有參數作爲未分化的值列表傳遞給子例程。例如,如果沒有通過引用傳遞數據結構的能力,那麼帶有兩個列表的函數的設計者將無法將這些列表分開。另外,如果數據結構很大,則通過引用來傳遞它們可以提供性能增益。
process_two_lists(@x, @y); # Can't distinguish the lists.
process_two_lists(\@x, \@y); # Can.
由於Python和Ruby的設計方式不同,因此它們在傳遞參數方面不需要這種區別。 Python或Ruby中的類似方法將接收兩個不同的參數(兩個對象,分別代表列表x
和y
)。
(2)Perl的行爲使@_
作爲別名作爲傳遞參數,允許子例程修改調用者感知的數據。
sub add_ten_to_me {
$_[0] += 10;
}
my $x = 1;
add_ten_to_me($x);
say $x; # 11 Amazing!
Python和Ruby也可以做這種類型的東西;但是,有一些資格。 Python區分可變的和不可變的對象。如果您將可變的內容傳遞給Python方法(例如列表),該方法可以修改數據結構。因此,Python版本process_two_lists
將能夠修改x
和y
。但是,接收不可變對象(例如整數)的函數不會。因此,一個直接的Python模擬add_ten_to_me
將無法正常工作。 [我相信可能會對Ruby有類似的觀點,但我現在不太瞭解細節。]
我認爲#2是人們通常所稱的「通過參考」。 #1被稱爲傳遞參考 – user102008 2011-08-11 08:22:57
通過引用傳遞參數可以顯着提高性能。
Perl爲您提供了選擇。我認爲這是TIMTOWTDI想法的一部分。這是一個靈活的方法,所以你可以做你需要的。如果你訪問參數爲$_[0]
那麼它是同一個對象。如果你轉移它或將它複製到一個詞彙,它是有價值的。
所以想想這樣。大多數代碼是有價值的,但是當你需要的時候通過引用就可以了。
- 1. 爲什麼JavaScript通過引用傳遞?
- 2. 通過引用傳遞數組參數
- 3. 爲什麼GCC允許通過右值引用捕獲?
- 4. 通過引用的CreateInstance傳遞參數
- 5. 通過引用傳遞的ANT參數
- 6. 參數傳遞通過引用
- 7. 通過引用傳遞參數Java
- 8. Maple通過引用傳遞參數
- 9. 傳遞參數通過引用
- 10. 爲什麼cppcheck說「函數參數應該通過引用傳遞」?
- 11. 在perl中通過引用傳遞值
- 12. 允許在腳本級別通過引用傳遞
- 13. 爲什麼在C中通過引用傳遞字符數組?
- 14. 爲什麼不通過引用傳遞結構通用優化?
- 15. 爲什麼要在PHP中通過引用傳遞原始類型參數?
- 16. 爲什麼要通過線程函數傳遞參數?
- 17. 是否允許傳遞* this作爲接受引用(&)的函數的參數?
- 18. 我是否正確傳遞參數並通過引用傳遞?
- 19. 爲什麼在通過參數傳遞值時會得到零?
- 20. 爲什麼C++不允許參數成爲默認參數?
- 21. 傳遞通過引用和參考
- 22. 爲什麼我的變量通過引用傳遞?
- 23. 爲什麼在java中沒有辦法通過引用傳遞
- 24. 原因:爲什麼java不通過引用傳遞?
- 25. 爲什麼在PHP中通過引用傳遞?
- 26. 通過引用遞歸函數傳遞參數
- 27. 通過構造函數傳遞什麼以及通過接口傳遞什麼?
- 28. 爲什麼std :: not1()通過const引用而不是通過值引用參數?
- 29. JBoss Seam只允許通過POST參數
- 30. 爲什麼片有時通過引用傳遞,有時是通過指針?
你是指隱式或顯式傳遞引用?也許提供一個你的意思的例子。 – TLP 2011-05-13 10:40:13
爲什麼你想忽略參考參數傳遞參數的能力? – 2011-05-13 11:59:05
看起來像'@ _'包含別名是人們在3天后依賴於Perl的一個偶然特徵 - 或者也許是'for'。搜索p5p存檔和git repo已經空了,但@tchrist或@merlyn會知道答案。 – 2011-05-13 14:04:54