2011-03-02 23 views
1

簡言之,我想知道是否有任何的最佳做法的理由之間作出決定:在Perl中,應該在傳遞哈希/數組引用和傳遞hashref/arrayref標量之間做出選擇?

my %hash = (foo => 1, bar => 2); 
# some in-between logic 
some_func(\%hash); 

my $hashref = { foo => 1, bar => 2 }; 
# some in-between logic 
some_func($hashref); 

或者是純粹的風格決定?

+1

首先,沒有這樣的事情作爲一個列表的引用。有arrayrefs和hashrefs。一個arrayref將會是對列表引用的最接近的東西,但是你用'{}'實際構建的是一個hashref。 arrayref會使用'[]'。 – cjm 2011-03-02 20:16:36

+0

@cjm:從perlref:「對枚舉列表*進行*引用與使用方括號不同 - 相反,它與創建引用列表相同!」 – 2011-03-02 20:19:46

+0

1.'print \%list' 2.'print $ listref' 3.尋找差異 – hlynur 2011-03-02 20:35:38

回答

1

兩個是等效的且可互換。這個決定應該根據你最清楚的做出。

您還可以前後移動:

my $hashref = {x => 1, y => 2}; 

our %hash; *hash = $hashref; 

some_func($hashref); 
some_func(\%hash); # \%hash == $hashref 

總的來說,我喜歡用複數形式%name@name工作,因爲它導致更少的線噪聲由於取消引用。這和some_func(\%var)更清晰的var的類型比some_func($var)

0

在大多數情況下,它不會有所作爲,但我已經從試圖改變在我的參考點,如果我通過在一個引用的名單發生了一些討厭的錯誤。

除非我真的想改變預先存在的數組或哈希的內容,我個人傾向於使用匿名列表/散列(就像你的第二個例子)。

這只是個人經驗,雖然。我會承認,如果我更好地理解Perl,我會知道客觀的最佳實踐(如果存在的話)。

1

這兩個例子做同樣的事情。所以它主要取決於哪一個更方便,如果有的話,你用%list變量和/或$listref變量做什麼。

或者,也許你想跳過完全是額外的變量:

some_func({ foo => 1, bar => 2 }); 

(不太可能現在你已經添加的那些「在兩者之間的邏輯」評論)

+0

沒有編輯歷史=從未發生;) – 2011-03-02 20:03:12

+0

+1 - 同意,純粹是爲了方便;但是,它應該在整個計劃中保持一致。 – Carl 2011-03-02 20:10:11

1

如上所示,它們是相同的,儘管第一個可能會給你更好的上下文,以獲得你在「一些中間邏輯」代碼中使用的變量類型(即散列)。