将数组传递给 sub、push 和 unshift - 数组未按预期扩展
pass array to sub, push and unshift - array is not extended as expected
use Data::Dump qw(dump);
my @arr = [1];
wrap(\@arr);
dump(@arr);
sub wrap {
my @a = @_;
push @a,2;
unshift @a, 0;
dump(@a);
}
结果:
[1]
(0, [[1]], 2)
这里有两个问题:
通过 ref 将数组传递给子 - 并期望它在之后被修改
为什么 push 和 unshift 不只是扩展数组 - 那个数组嵌套是什么?
(perl 新手)
my @arr = [1];
这将创建一个包含其中一项的数组 -- 该项是对包含您的 1
的匿名数组(通过使用方括号创建)的数组引用。你可能应该选择 my @arr = (1);
wrap(\@arr);
很好 - 它传递了对 @arr
数组的引用。
sub wrap {
my @a = @_;
您没有取消引用它,所以现在您的 @a
数组包含一个数组引用,该数组引用包含一个包含 1
的数组引用。您的数组看起来像这样:@a = ( [ [ 1 ] ] )
push @a, 2; # @a = ([[1]], 2);
unshift @a, 0; # @a = (0, [[1]], 2);
在 wrap
中,参数中有一个标量数组引用,因此您可以将它放在标量而不是数组中:
my ($aref) = @_; # or: my $aref = shift;
并使用前导 @
:
取消引用
push @$aref, 2;
unshift @$aref, 0;
另见 perldoc perlref。
use Data::Dump qw(dump);
my @arr = [1];
wrap(\@arr);
dump(@arr);
sub wrap {
my @a = @_;
push @a,2;
unshift @a, 0;
dump(@a);
}
结果:
[1]
(0, [[1]], 2)
这里有两个问题:
通过 ref 将数组传递给子 - 并期望它在之后被修改
为什么 push 和 unshift 不只是扩展数组 - 那个数组嵌套是什么?
(perl 新手)
my @arr = [1];
这将创建一个包含其中一项的数组 -- 该项是对包含您的 1
的匿名数组(通过使用方括号创建)的数组引用。你可能应该选择 my @arr = (1);
wrap(\@arr);
很好 - 它传递了对 @arr
数组的引用。
sub wrap {
my @a = @_;
您没有取消引用它,所以现在您的 @a
数组包含一个数组引用,该数组引用包含一个包含 1
的数组引用。您的数组看起来像这样:@a = ( [ [ 1 ] ] )
push @a, 2; # @a = ([[1]], 2);
unshift @a, 0; # @a = (0, [[1]], 2);
在 wrap
中,参数中有一个标量数组引用,因此您可以将它放在标量而不是数组中:
my ($aref) = @_; # or: my $aref = shift;
并使用前导 @
:
push @$aref, 2;
unshift @$aref, 0;
另见 perldoc perlref。