【问题标题】:Removing array elements in Perl在 Perl 中删除数组元素
【发布时间】:2013-07-29 23:34:49
【问题描述】:

我想删除整个数组。目前我做@array=(); 它是否删除元素并清除内存,垃圾收集?如果不需要,我需要使用 Splice 吗?。

【问题讨论】:

标签: perl


【解决方案1】:

http://perldoc.perl.org/functions/undef.html

undef @array; 

应该做你需要的。

【讨论】:

    【解决方案2】:
    @array = (); 
    

    没关系,你也可以用

    undef @array; 
    

    请注意,这是错误

    @array = undef;
    

    它的值为undef

    【讨论】:

    • 另一个选项是$#array = -1,它会截断数组。但我不建议这样做。
    【解决方案3】:
    • 您需要这样做非常奇怪。正确使用my 意味着很少需要清空数组。

    • @array = (); 将释放元素并根据需要调用任何析构函数。换句话说,如果元素没有根据需要在其他地方使用,它们将被垃圾回收(甚至在操作结束之前)。

    • @array = (); 不会释放底层数组缓冲区。这是一件好事。 undef @array; 将强制释放内存,当您开始将更多元素放入数组时,这将强制进行大量分配。


    所以,

    • 如果您想释放一个数组,因为您将永远不会再次使用它,请将 my @array; 放在正确的位置,将其范围限制在您需要的位置。

        {
           my @array;
           ...
        } # Elements of @array garbage collected here.
      
    • 如果您想清空要重复使用的数组,请使用@array = ();

        my @array;
        while (...) {
           if (...) {
              push @array, ...;
           } else {
              ... use @array ...
              @array = ();  # Elements of @array garbage collected here.
           }
        }
      
    • 不要使用undef @array;


    如果方便的话,你可以使用splice

     say for @array;
     @array = ();
    

    可以写成

     say for splice(@array);
    

    【讨论】:

    • 非常感谢您提供的信息。我正在执行您发布的while循环方式,重用数组并清除它直到循环结束。我担心如果不是垃圾收集并且没有释放内存,我将在 while 循环中耗尽内存。你提到当我做@array =()时内存没有被释放。 perl 解释器是否将其标记为仅用于垃圾收集?当我重用数组时,它会覆盖之前分配和使用的内存吗?
    • perl 解释器是否将其标记为单独进行垃圾回收? 该数组不能被 GC,因为即使它为空,它仍在使用中。 当我重用数组时,它会覆盖之前分配和使用的内存吗? 是的。更改数组会更改该数组使用的内存。
    • 也许您认为() 创建了一个数组?它没有。那根本不会创造任何东西。它只是一个占位符,根本不表示任何内容。 my @array; 创建一个数组。 [] 还创建一个数组(并返回对它的引用)。
    【解决方案4】:

    如果您的目标是将内存释放回操作系统,那么您可能不走运。如果您的目标是让内存可供您的 perl 程序再次使用,那么其他答案都很好。

    有关更多详细信息,请查看以下链接
    http://www.perlmonks.org/?node_id=243025
    In Perl, how can I release memory to the operating system?

    【讨论】:

      【解决方案5】:

      所有这些食谱都没有帮助我,但我找到了一个新的:

      my @tmp_arr = qw();
      @array = @tmp_arr;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 2011-11-23
        相关资源
        最近更新 更多