传递给函数时,如何解引用数组数组?如何在Perl中取消引用数组数组?
我这样做是这样的:
my @a = {\@array1, \@array2, \@array3};
func(\@a);
func{
@b = @_;
@c = @{@b};
}
其实我想要的阵列@c
应包含@array1
,@array2
,并@array3
地址。
传递给函数时,如何解引用数组数组?如何在Perl中取消引用数组数组?
我这样做是这样的:
my @a = {\@array1, \@array2, \@array3};
func(\@a);
func{
@b = @_;
@c = @{@b};
}
其实我想要的阵列@c
应包含@array1
,@array2
,并@array3
地址。
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
完全相同。
应该
func {
$b = shift;
}
,如果你传递一个参考。希望有助于一些。
阅读perlreftut文档。
编辑:其他人指出我最初错过了一个好点。在@a的初始化中,您可能是指@a = (...)
(创建包含引用的数组)或$arrayref = [...]
(创建对数组的引用),而不是{...}
(创建对散列的引用)。这篇文章的其余部分假设你有@a = (...)
版本。
由于您将一个参数(对@a
的引用)传递给func
,因此@_是包含该引用的列表。你可以得到引用,然后取消对它的引用这样做:
sub func {
my $arrayref = shift;
my @c = @{$arrayref};
}
或者在一个行,它看起来像:
sub func {
my @c = @{shift()};
}
(如果你没有在func(\@a)
用反斜杠,@_将等于@a
,这是三个引用的数组。)
您可能需要阅读perldoc perlreftut
,perldoc perlref
和perldoc 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] ];
嗨,非常感谢...它运作良好..非常感谢你 – jack 2010-10-14 12:04:36
我不认为'@a = {\ @数组1 ,\ @ array2,\ @ array3}'做你认为它的作用。 – mob 2010-10-13 15:05:34
在这么几行代码中有很多误解。 – 2010-10-13 15:10:27
Perl有引用,而不是指针(如C)。你无法获得变量的地址,也不需要。 (为了任何足够熟练的Perl黑客谁觉得有必要指出的是,这是不是100%准确的信息:不要在OP是混乱的够多了。) – 2010-10-13 15:16:09