2010-10-13 59 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