2011-06-29 27 views
4

我知道這可能是一個簡單的修復,但我一直無法通過google找到答案,並通過這裏的問題搜索。將數組傳遞給分別打印每個數組的子例程

我的目標是將多個數組傳遞給子例程,該子例程分別遍歷每個數組,並在每個數組之前和之後打印每個數組。

我有什麼:

@A1 = (1, 2, 3); 
@A2 = (4, 5, 6); 

printdata(@A1, @A2) ; 

sub printdata { 
    foreach(@_) { 
     print "$_" ; 
     print "@@@" 
     } 
    } 

什麼,我試圖得到的是:

123 @@@ 456 @@@

而是其治療兩個陣列爲一體,並通過每個迭代數組中的變量,將每個變量之後的分隔符放在整個數組中。

1 @@@ 2 @@@ 3 @@@等.....

我不知道怎麼去子程序治療陣列作爲單獨的,而不是一個。

任何幫助將不勝感激!

+0

您發現的是Perl中的List上下文。列表是傳遞給方法的東西(幾乎在任何時候你都使用paren和逗號)。它們會自動將它們內部的任何東西扁平化 - 數組或散列。將參數傳遞給函數時(例如,可以在數組中構建所有參數,然後將其作爲列表傳遞給函數)或整理來自多個源的數據(例如組合多個哈希或數組),這可能非常方便,但是對於大多數程序員來說,「背景」這個概念是新的,因此可以讓人們跳出來。 :) –

回答

6

您需要通過數組作爲參考:

@A1 = (1, 2, 3); 
@A2 = (4, 5, 6); 

printdata(\@A1, \@A2) ; 

sub printdata { 
    foreach(@_) { 
     print @$_ ; 
     print "@@@" 
     } 
} 

子調用擴展陣列到標量的列表,然後將其傳遞給@_變量中的子。例如: -

printdata(@A1, @A2); 

等於:

printdata(1,2,3,4,5,6); 
+0

完美的感謝,我知道我錯過了一些簡單的東西。我並不完全理解參考文獻,但我現在正在研究它。 – Kevin

+0

它並不簡單,通過加入「\」他引入了一個新概念的perl編程,它與你的概念 – mac

2
use strict; 
use warnings; 
use English qw<$LIST_SEPARATOR>; 

my @A1 = (1, 2, 3); 
my @A2 = (4, 5, 6); 
{ local $LIST_SEPARATOR = ''; 
    my @a = map { "@$_" } \@A1, \@A2; 
    $LIST_SEPARATOR = '@@@'; 
    print "@a\n"; 
} 

你也可以使用join(po-tay-to,po-tah-to)。

my @a = map { join('', @$_) } \@A1, \@A2; 
print join('@@@', @a), "\n"; 
+0

我喜歡使用稍微模糊的'continue':'(@_){print @ $ _} continue {print「@@@」}' – TLP

+0

@TLP,Cool !.我從來沒有使用過「繼續」,它總是看起來像一個難看的東西 - 可能是來自其他語言的偏見。我可能需要重新考慮。 – Axeman

+0

我從來沒有使用過它。 ;)我只是認爲這是一個有趣的機會來嘗試。簡單的助記符:它與c樣式循環中的第三個元素相同,即for(init; inc; * continue *)' – TLP