修改子程序中的数组

Bla*_*ppo 14 perl

我有一些代码没有按照我期望的方式工作,我很感激帮助找出如何让它按照我期望的方式工作.

我想使用子程序来修改输入数组.我想如果我传入对数组的引用,我对它做的任何更改都会反映在调用者的版本中.但它显然不起作用.


my @test_array = qw (zero one two three);

shift_array(\@test_array);
print "POST SUBROUTINE: $test_array[0]\n";

sub shift_array {
    my @array = @{(shift)};
    shift @array;
    print "AFTER SHIFT IN SUB: $array[0]\n";
}
Run Code Online (Sandbox Code Playgroud)

这打印:

AFTER SHIFT IN SUB: one
POST SUBROUTINE: zero

我预计它会打印one两次.

所以我的问题是双重的:

1)为什么它不像我认为的那样表现?传递对数组的引用是否会创建数组的副本?

2)我如何得到我期望的行为?II如何获得一个子程序从输入数组的调用者副本前面滑出一个或多个元素?

提前感谢您提供的任何见解.

Cfr*_*eak 11

因为my @array是您将解除引用的原始数组分配给的新数组.这是一份副本.

而是这样做:

sub shift_array {
    my $array = shift;
    shift( @$array );
}
Run Code Online (Sandbox Code Playgroud)

编辑:我最初说解除引用它会产生问题,但使用@$array仍然是取消引用它.正如@mob指出的那样,分配变量是创建新数组而不是更新现有引用的原因.

  • 请注意,使用perl 5.14+,您可以在sub中编写`shift $ array`,并且取消引用会自动发生. (4认同)