删除Perl中的数组元素

时间:2013-07-30 00:43:15

标签: perl

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

5 个答案:

答案 0 :(得分:10)

  • 你需要这样做是非常奇怪的。正确使用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);

但这不会影响垃圾收集。

答案 1 :(得分:1)

@array = (); 

没问题,你也可以用

undef @array; 

请注意,这是错误

@array = undef;

它的值为undef

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

undef @array; 

应该做你需要的。

答案 4 :(得分:0)

所有这些食谱都帮不了我,但是我找到了一个新食谱:

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