如何彻底删除Perl中的包?

前端之家收集整理的这篇文章主要介绍了如何彻底删除Perl中的包?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在Perl中完全删除一个包?这意味着不仅包变量,而且还包括Perl更新以处理继承变更和其他事情的任何魔术表。

这个简单的测试:

use warnings; use strict;
use Test::LeakTrace;
use Symbol 'delete_package';

leaktrace {
   package test;
   our $x = 1;

   package main;
   delete_package 'test';
};

产生以下输出

leaked ARRAY(0x81c930)  from /lib/perl5/5.10.1/Symbol.pm line 166.
leaked HASH(0x827760)   from /lib/perl5/5.10.1/Symbol.pm line 166.
leaked SCALAR(0x821920) from /lib/perl5/5.10.1/Symbol.pm line 166.

将-verbose标志用于leaktrace会导致我可以根据请求发布的数据的屏幕。

如果我们的@ISA =’main’的行变得更糟;被添加到测试包中:

leaked ARRAY(0x81cd10) from so.pl line 32.
leaked SCALAR(0x81c930) from so.pl line 32.
leaked ARRAY(0x8219d0) from so.pl line 32.
leaked HASH(0x8219c0) from so.pl line 32.
leaked SCALAR(0x8219b0) from so.pl line 32.
leaked HASH(0x8219a0) from so.pl line 32.
leaked SCALAR(0x821970) from /lib/perl5/5.10.1/Symbol.pm line 161.
leaked HASH(0x821950) from so.pl line 32.
leaked SCALAR(0x821940) from so.pl line 32.

32号线是我们@ISA所在的地方。

说明这些确实是泄漏,而不仅仅是口译中的噪音:

my $num = 0;
while (1) {
    no strict 'refs';
    @{$num.'::ISA'} = 'main';
    delete_package $num++;
}

将以恒定的速度吃记忆

那么,有没有比Symbol的delete_package摆脱一个更好的方法呢?还有什么我需要做的来帮助它吗?

我在5.8.8,5.10.1和5.12中看到了同样的行为

解决方法

所以这是Perl中的一个bug,即使你发现也是这样。没有修复,似乎你唯一的方法来避免这些泄漏是选择另一种方法解决你的问题。

你需要一个半匿名的包,而不是例如封闭?那些容易做到不泄漏的东西,并且通过一些创造力,你仍然可以在它们之间实现几乎每个外部接口,例如祝福你的关闭代码,并为他们提供方法,为他们提供重载等等。

猜你在找的Perl相关文章