gpt4 book ai didi

perl - 如何彻底删除 Perl 中的包?

转载 作者:行者123 更新时间:2023-12-02 16:36:02 26 4
gpt4 key购买 nike

如何在 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 会产生一屏数据,我可以根据请求发布这些数据。

如果将 our @ISA = 'main'; 行添加到 test 包中,情况会变得更糟:

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 中的一个错误,即使您发现了,也是一个已报告的错误。如果不解决这个问题,避免这些泄漏的唯一方法似乎就是选择另一种方法来解决您的问题。

为什么你需要一个半匿名包而不是一个闭包?这些很容易避免泄漏,并且通过一些创造力,您仍然可以在它们之上实现几乎所有外部接口(interface),例如通过支持您的闭包代码引用并为它们提供方法,为它们提供重载等等。/p>

关于perl - 如何彻底删除 Perl 中的包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3807061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com