Perl'deki bir paketi nasıl tamamen sildiniz? Bu sadece paket değişkenleri değil, aynı zamanda Perl'in miras değişiklikleri ve diğer şeyleri ele almak için güncellediği herhangi bir sihirli tablo anlamına gelir.Perl'deki bir paketi nasıl tamamen silebilirim?
Bu basit testi: Aşağıdaki çıktıda
use warnings; use strict;
use Test::LeakTrace;
use Symbol 'delete_package';
leaktrace {
package test;
our $x = 1;
package main;
delete_package 'test';
};
sonuçları:
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.
Ben istek üzerine gönderebilir veri screenfuls içinde leaktrace
sonuçlar için -verbose
bayrağını kullanma. our @ISA
olduğu
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.
Hat 32'dir: çizgi our @ISA = 'main';
test
paketine eklenirse
şeyler kötüleşir.
bunlar gerçekten sızıntı ve tercüman değil sadece gürültü olduğunu göstermek için:my $num = 0;
while (1) {
no strict 'refs';
@{$num.'::ISA'} = 'main';
delete_package $num++;
}
Yani sabit bir hızda bellek yiyeceğim, bir paketin kurtulmak için daha iyi bir yol yoktur Symbol'un delete_package
'dan mı? Yardım etmek için yapmam gereken başka bir şey var mı?
ben 5.8.8, 5.10.1 de aynı davranışı gördük ve 5.12
Harika bir soru, merakım sivridir, ama sormam gerek: Neden? –
CPAN'daki "List :: Gen" modülümde, (http://search.cpan.org/perldoc?List::Gen), geçici bir pakete kapatma temelli bir nesne yükleyen bir "lanet işlevi" işlevine sahibim (standart yöntem çağrılarını kolaylaştırmak için) (yüksek hızda). 'delete_package' her şeyi temizler, ancak yukarıdaki '' curse '' yukarıdaki sorunlardan dolayı hala bellek sızdırıyor. Sızıntı çok büyük değil, ama orada ve mümkünse takmak istiyorum. –
Henüz yapmadıysanız, bunu bir perl hatası olarak kaydedin. – ysth