2010-01-14 21 views
2

嘿。在Python我可以這樣做:如何返回一個列表作爲Perl中的數組引用?

def fnuh(): 
    a = "foo" 
    b = "bar" 
    return a,b 

我能在Perl中同樣優雅的方式返回一個列表,尤其是在子程序的返回類型應該是一個數組的引用?

我知道我可以做

sub fnuh { 
    my $a = "foo"; 
    my $b = "bar"; 
    my $return = []; 
    push (@{$return}, $a); 
    push (@{$return}, $b); 
    return $return; 
} 

但我敢打賭,有一個更好的辦法做到這一點在Perl。你知道嗎?

+2

要小心列表和數組之間的區別。這是一個導致很多混亂的領域。理解這種區分對於理解環境如何工作很重要。請參閱http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array%3f和http://www.perlmonks.org/?node_id= 130861和http://www.perlmonks.org/?node_id=719099進行一些討論。 – daotoad 2010-01-14 16:43:13

+2

謝謝,我認爲這必須涉及列表,但實際上我最喜歡的解決方案 - 返回[$ a,$ b] - 不涉及一個。如果你知道更好的方式來陳述問題的意圖,請告訴我。 – 0x89 2010-01-14 17:02:39

+0

你的問題沒有問題。在大多數語言中,列表和數組之間沒有真正的區別。 Perl是有區別的。列表是一組有序的值。一個數組是一個變量數據類型,它包含一系列索引可訪問的有序值。你的首選答案是*正是*你所要求的。我只是想強調數組和列表之間的區別。這是一個微妙的事情,但真正理解它的確有助於理解Perl中的上下文是如何工作的。 – daotoad 2010-01-14 17:22:09

回答

7

當然,只需在列表前敲擊\即可返回參考。

或者用[ list elements ]製作一個新的arrayref。

在你的榜樣,

sub f1 { 
    my $a = "foo"; 
    my $b = "bar"; 
    return [ $a, $b ]; 
} 

sub f2 { 
    my $a = "foo"; 
    my $b = "bar"; 
    push @return, $a, $b; 
    return \@return; 
} 

請參閱更多參考perldoc perlreftutperldoc perlref。還有一個數據結構食譜perldoc perldsc

你也可能需要閱讀在perlfaq這個問題(感謝布賴恩):"What's the difference between a list and an array?"

+6

第二種方式,你肯定想用'my'聲明'@ return',否則它會變成全局的,不太好。 「 – Dan 2010-01-14 16:24:29

+2

」#最後一個表達式自動返回;不需要顯式「 - 關於這個,我更喜歡python。從「蟒蛇之禪」中,第二句話: 顯式比隱式更好。 所以我寧願:return [$ a,$ b]; – 0x89 2010-01-14 16:38:09

+2

我寧願總是做明確的回報。添加一些清晰度沒有任何問題。特別是在Perl中。 :) – friedo 2010-01-14 16:42:32

6

Python的自動打包或解包圍繞分配模擬列表元組。在Perl中,你可以用同樣的方式編寫它,返回一個列表。

sub fnuh { 
    my $a = 'foo'; 
    my $b = 'bar'; 
    $a, $b 
} 

然後使用結果:

my ($x, $y) = fnuh; 

,或者如果您需要參考:

my $ref = [ fnuh ]; 
+0

我喜歡這個答案的簡單性。另外,'wantarray'。 – 2010-01-14 17:07:14

+0

還有更多的瑣事:Perl最佳實踐,第2章:代碼佈局,分號:「在每個語句後放一個分號」。 第4章:值和表達式,列表:「括括每個原始列表」。 儘管我中的極簡主義者喜歡簡潔的語法。 – 0x89 2010-01-14 18:27:21

+0

Perl最佳實踐不是聖經。這是達米安喜歡做的事情。這並不意味着你必須這樣做。查看我對他的採訪:http://www.theperlreview.com/Interviews/damian-bpp-20050622.html – 2010-01-14 18:50:38

-1

您可以明確地測試情境是否想要獲得相同的功能的Python陣列,功能wantarray

sub fnuh { 
    my $a = 'foo'; 
    my $b = 'bar'; 
    return wantarray ? ($a, $b), [ $a, $b ]; 
} 

或者,如果你想這樣做了很多,你可以寫,這將能夠讀取相同的情況下,只要你沒有改變它的功能。

sub pack_list { 
    my $want = wantarray; 
    return unless defined $want; # void context 
    return $want ? @_ : \@_; 
} 

然後調用它像這樣:

return pack_list($a, $b); 
+1

在Perl中處理上下文是最好的方法來開始自己的腳步。 – 2010-01-15 09:21:31

+0

@ Hynek -Pichi- Vychodil:我不知道你爲什麼這麼說。 * Context *是我在Perl中最喜歡的東西之一。當我在Java中工作時,我經常希望我可以做同樣的事情,而無需額外的參數傳遞和重載。 *如果*你不熟悉上下文,可能會引起混淆。 – Axeman 2010-01-15 22:55:18

相關問題