将数组传递给 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)

这里有两个问题:

  1. 通过 ref 将数组传递给子 - 并期望它在之后被修改

  2. 为什么 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