2010-10-13 80 views
0

傳遞給函數時,如何解引用數組數組?如何在Perl中取消引用數組數組?

我這樣做是這樣的:

my @a = {\@array1, \@array2, \@array3}; 

func(\@a); 


func{ 
    @b = @_; 

    @c = @{@b}; 
} 

其實我想要的陣列@c應包含@array1@array2,並@array3地址。

+3

我不認爲'@a = {\ @數組1 ,\ @ array2,\ @ array3}'做你認爲它的作用。 – mob 2010-10-13 15:05:34

+7

在這麼幾行代碼中有很多誤解。 – 2010-10-13 15:10:27

+0

Perl有引用,而不是指針(如C)。你無法獲得變量的地址,也不需要。 (爲了任何足夠熟練的Perl黑客誰覺得有必要指出的是,這是不是100%準確的信息:不要在OP是混亂的夠多了。) – 2010-10-13 15:16:09

回答

7
my @a = {\@array1, \@array2, \@array3}; 

上面是具有單個部件的陣列 - >一個散列含有:

{ ''.\@array1 => \@array2, ''.\@array3 => undef } 

因爲隨着在散列密鑰,Perl的脅迫提及@array1成一個字符串。 Perl允許將一個標量哈希引用分配給一個數組,因爲它「被理解」爲你想要一個數組,其中第一個元素是你賦給它的標量。

您創建一個數組的數組,就像這樣:

my @a = (\@array1, \@array2, \@array3); 

然後在你的功能,你會解開他們,就像這樣:其

sub func { 
    my $ref = shift; 
    foreach my $arr (@$ref) { 
     my @list_of_values = @$arr; 
    } 
} 

還是有一些變化,好比說一個地圖將是最簡單的表達式:

my @list_of_entries = map { @$_ } @$ref; 

在您的示例中,@c作爲列表地址與正確構建的@a完全相同。

-1

應該

func { 
    $b = shift; 
} 

,如果你傳遞一個參考。希望有助於一些。

0

閱讀perlreftut文檔。

編輯:其他人指出我最初錯過了一個好點。在@a的初始化中,您可能是指@a = (...)(創建包含引用的數組)或$arrayref = [...](創建對數組的引用),而不是{...}(創建對散列的引用)。這篇文章的其餘部分假設你有@a = (...)版本。

由於您將一個參數(對@a的引用)傳遞給func,因此@_是包含該引用的列表。你可以得到引用,然後取消對它的引用這樣做:

sub func { 
    my $arrayref = shift; 
    my @c = @{$arrayref}; 
} 

或者在一個行,它看起來像:

sub func { 
    my @c = @{shift()}; 
} 

(如果你沒有在func(\@a)用反斜槓,@_將等於@a,這是三個引用的數組。)

5

您可能需要閱讀perldoc perlreftutperldoc perlrefperldoc perldsc你可以說:

sub func { 
    my $arrayref = shift; 

    for my $aref (@$arrayref) { 
     print join(", ", @$aref), "\n"; 
    } 
} 

my @array1 = (1, 2, 3); 
my @array2 = (4, 5, 6); 
my @array3 = (7, 8, 9); 

my @a = \(@array1, @array2, @array3); 

func \@a; 

或更簡潔:

sub func { 
    my $arrayref = shift; 

    for my $aref (@$arrayref) { 
     print join(", ", @$aref), "\n"; 
    } 
} 

func [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; 
+0

嗨,非常感謝...它運作良好..非常感謝你 – jack 2010-10-14 12:04:36