2011-05-13 64 views
5

我想知道爲什麼Perl有能力參照函數傳遞參數? 我知道Python和Ruby都不具備這樣的功能。爲什麼Perl允許通過引用傳遞參數?

+2

你是指隱式或顯式傳遞引用?也許提供一個你的意思的例子。 – TLP 2011-05-13 10:40:13

+0

爲什麼你想忽略參考參數傳遞參數的能力? – 2011-05-13 11:59:05

+0

看起來像'@ _'包含別名是人們在3天后依賴於Perl的一個偶然特徵 - 或者也許是'for'。搜索p5p存檔和git repo已經空了,但@tchrist或@merlyn會知道答案。 – 2011-05-13 14:04:54

回答

7

將一件事與另一件區分開很有用。

(1)通過引用將參數傳遞給子程序。這在Perl中很有用,因爲語言將所有參數作爲未分化的值列表傳遞給子例程。例如,如果沒有通過引用傳遞數據結構的能力,那麼帶有兩個列表的函數的設計者將無法將這些列表分開。另外,如果數據結構很大,則通過引用來傳遞它們可以提供性能增益。

process_two_lists(@x, @y); # Can't distinguish the lists. 
process_two_lists(\@x, \@y); # Can. 

由於Python和Ruby的設計方式不同,因此它們在傳遞參數方面不需要這種區別。 Python或Ruby中的類似方法將接收兩個不同的參數(兩個對象,分別代表列表xy)。

(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將能夠修改xy。但是,接收不可變對象(例如整數)的函數不會。因此,一個直接的Python模擬add_ten_to_me將無法​​正常工作。 [我相信可能會對Ruby有類似的觀點,但我現在不太瞭解細節。]

+1

我認爲#2是人們通常所稱的「通過參考」。 #1被稱爲傳遞參考 – user102008 2011-08-11 08:22:57

6

通過引用傳遞參數可以顯着提高性能。

4

Perl爲您提供了選擇。我認爲這是TIMTOWTDI想法的一部分。這是一個靈活的方法,所以你可以做你需要的。如果你訪問參數爲$_[0]那麼它是同一個對象。如果你轉移它或將它複製到一個詞彙,它是有價值的。

所以想想這樣。大多數代碼是有價值的,但是當你需要的時候通過引用就可以了。

相關問題