2010-07-29 50 views
0

好的,這是交易。我有一個數組(從一個400 MB的文件輸入),如果我對它運行sort()命令,comp運行內存不足。輸入文件不是問題,所以我決定將初始數組分割成更小的數組,以便執行排序。我可以將初始數組分解成大小爲100k的數組,這是我的代碼所做的。在Perl覆蓋數組中推送電話

(對於此測試的目的,我已經從收縮400 MB的文件爲40 MB)

運行我破陣列碼,並在第一次迭代中,我有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

取決於你如何範圍界定它,你可能會改寫你的記憶,當你更新@sorted。看看這給你更好的結果:

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

而且它確實如此簡單......這讓我很難過:P 非常感謝:) – ThePirateSheep 2010-07-29 16:15:59

2

如果你的循環使用相同的@sorted變量(即,它宣稱/第一循環範圍外使用),那麼Perl正在這裏預期。 \@sorted是對排序數組的引用,因此它總是與@sorted當前值相同,而不是第一次引用時的值。