处理它返回的数组的子程序?

时间:2014-07-17 20:00:28

标签: perl

我想

my @Array;

for (my $i=1; $i <= 10000; $i++) {

ProsArray(\@Array);

}


sub ProsArray {

  my @Array = @{$_[0]};
  #do stuff to @Array (e.g., remove or add elements...
  push(@Array,10);
  return(@Array);

}

但是,子程序作用于我最初声明的@Array - 而不是它在前一次迭代中返回的@Array

我想要像

这样的东西
while(...){
@Array = ProsArray(\@Array);
}

所以它会处理返回的数组而不是初始数组。

2 个答案:

答案 0 :(得分:2)

来自评论:

我相信您面临的问题是由您进行递归的方式引起的。

@Array = ProsArray(\@Array);

每次都将相同的引用传递给原始的@array对象。尝试删除&#34; \&#34;并重新运行您的代码。

答案 1 :(得分:2)

如果你想在你的阵列上操作,你需要对你传递的参考进行操作。或者,您需要存储返回值。

use strict;
use warnings;
use Data::Printer;

my @array_inplace = (1 .. 5);
my @array_return = (1 .. 5);

for (1 .. 3) {
    ProsArrayInplace(\@array_inplace);
    @array_return = ProsArrayRet(\@array_return); # replace array with retval
}

sub ProsArrayInplace {
  my ($array) = @_;
  #do stuff to @$Array (e.g., remove or add elements...
  push(@$array,10); # modify in place
}

sub ProsArrayRet {
  my @array = @{$_[0]}; #dereference
  #do stuff to @$Array (e.g., remove or add elements...
  push(@array,10); #modify array scoped to sub
  return @array; #return modified array
}

p(@array_inplace);
p(@array_return);

结果:

[
    [0] 1,
    [1] 2,
    [2] 3,
    [3] 4,
    [4] 5,
    [5] 10,
    [6] 10,
    [7] 10
]
[
    [0] 1,
    [1] 2,
    [2] 3,
    [3] 4,
    [4] 5,
    [5] 10,
    [6] 10,
    [7] 10
]