【问题标题】:Push call in Perl overwriting arrayPerl覆盖数组中的推送调用
【发布时间】:2011-03-22 19:41:39
【问题描述】:

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

(出于本次测试的目的,我已将文件从 400 MB 缩小到 40 MB)

我运行我的中断数组代码,在第一次迭代时,我在@arrayList 中有一个 100k 的数组作为参考。我的代码是这样的:

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.

我已尝试使用我能想到的所有不同方式来解决此问题,但我没有任何想法。有什么帮助吗?

谢谢

【问题讨论】:

    标签: perl arrays push


    【解决方案1】:

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

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

    【讨论】:

    • 真的就这么简单......这让我内心感到难过 :P 非常感谢:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2017-04-20
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多