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)
这里有两个问题:
通过引用将数组传递给子 - 并期望之后修改它
为什么推送和取消连接只是扩展阵列 - 那个数组嵌套的是什么?
(perl新手)
答案 0 :(得分:2)
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;