如何在Perl中取消引用数组数组?

jac*_*ack 1 perl perl-data-structures

传递给函数时如何取消引用数组?

我是这样做的:

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

func(\@a);


func{
    @b = @_;

    @c = @{@b};
}
Run Code Online (Sandbox Code Playgroud)

其实我想要的数组@c应包含的地址@array1,@array2@array3.

Axe*_*man 8

my @a = {\@array1, \@array2, \@array3};
Run Code Online (Sandbox Code Playgroud)

以上是一个包含单个成员的数组 - >一个包含以下内容的哈希:

{ ''.\@array1 => \@array2, ''.\@array3 => undef }
Run Code Online (Sandbox Code Playgroud)

因为作为哈希中的键,Perl将引用强制@array1转换为字符串.并且Perl允许将标量散列引用分配给数组,因为"理解"您希望数组的第一个元素是您为其分配的标量.

您创建一个数组数组,如下所示:

my @a = (\@array1, \@array2, \@array3);
Run Code Online (Sandbox Code Playgroud)

然后在你的函数中你将解压缩它们,如下所示:

sub func {
    my $ref = shift;
    foreach my $arr ( @$ref ) {
        my @list_of_values = @$arr;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者其中的一些变体,比如说地图将是最简单的表达:

my @list_of_entries = map { @$_ } @$ref;
Run Code Online (Sandbox Code Playgroud)

在您的示例中,@c因为地址列表与正确构造的地址完全相同@a.


Cha*_*ens 5

您可能需要阅读perldoc perlreftut,perldoc 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;
Run Code Online (Sandbox Code Playgroud)

或者更紧凑:

sub func {
    my $arrayref = shift;

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

func [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
Run Code Online (Sandbox Code Playgroud)