将数组传递给sub,push和unshift - 数组未按预期扩展

时间:2015-01-15 06:20:37

标签: arrays perl

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. 通过引用将数组传递给子 - 并期望之后修改它

  2. 为什么推送和取消连接只是扩展阵列 - 那个数组嵌套的是什么?

  3. (perl新手)

1 个答案:

答案 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;

另见perldoc perlref