在Perl中覆盖调用覆盖数组

时间:2010-07-29 15:50:03

标签: perl arrays push

好的,这是交易。我有一个数组(从400 MB文件输入),如果我在其上运行sort()命令,comp就会耗尽内存。输入文件不是问题,所以我决定将初始数组分解为可以执行排序的较小数组。我可以将初始数组分解为大小为100k的数组,这是我的代码所做的。

(为了进行此测试,我将文件从400 MB缩小到40 MB)

我运行我的break数组代码,在第一次迭代中,我有一个100k的数组作为我的@arrayList中的引用。我的代码就是这样:

push @arrayList, \@sorted;        #@sorted is the sorted version of the 100k array
$temp = @arrayList;               #returns 1, which it should 
@arrayTemp2 = @{$arrayList[0]};
$temp = @arrayTemp2;              #returns 100k, which it should
@arrayTemp2 = @{$arrayList[1]};
$temp = @arrayTemp2;              #returns 0 since it is uninitialized

在for循环的下一个循环中,排序的数组是初始数组的其余部分,只有23k。相同的代码再次运行,结果如下:

push @arrayList, \@sorted;        #@sorted is the sorted version of the 23k array
$temp = @arrayList;               #returns 2, which it should 
@arrayTemp2 = @{$arrayList[0]};
$temp = @arrayTemp2;              #returns 23301, which is wrong
@arrayTemp2 = @{$arrayList[1]};
$temp = @arrayTemp2;              #returns 23301, which is right.

我尝试过用我能想到的各种方法来解决这个问题,而我只是没有想法。有什么帮助吗?

由于

2 个答案:

答案 0 :(得分:2)

根据您的范围,您可能会在更新@sorted时覆盖您的记忆。看看这是否能给你带来更好的结果:

push @arrayList, [ @sorted ];    # an array reference to a *copy* of @sorted

答案 1 :(得分:2)

如果你的循环使用相同的@sorted变量(也就是说,它声明/首先在循环范围之外使用),那么Perl在这里按预期工作。 \@sorted是对已排序数组的引用,因此它始终与@sorted当前值相同,而不是首次引用时的值。