Дано - скрипт a.pl и модуль bb.pm, в bb.pm есть функция ff(), хочется чтобы при изменении файла bb.pm он перезагружался заново. Якобы это делает Module::Refresh, но он работать не хочет. Я выдернул механизм удаления пакета и функций из Module::Refresh для большей наглядности. Проблема в том, что после очистки %INC и символьной таблицы при повторном require bb.pm функция ff() не появляется. Пример
a.pl:
Код:
#!/usr/bin/perl -w
BEGIN { $^P |= 0x10;
eval 'sub DB::sub' if $] < 5.008007; };
use strict;
use bb;
foreach my $m (keys %INC) {
print "INC $m ".$INC{$m}."\n";
}
foreach my $sym ( grep { index( $DB::sub{$_}, "bb.pm:" ) == 0 }
keys %DB::sub ) {
print "sym=$sym\n";
}
delete $INC{'bb.pm'};
print "after delete \$INC{'bb.pm'}\n";
foreach my $m (keys %INC) {
print "INC $m ".$INC{$m}."\n";
}
foreach my $sym ( grep { index( $DB::sub{$_}, "bb.pm:" ) == 0 }
keys %DB::sub ) {
print "delete subrotine $sym\n";
eval { undef &$sym };
warn "$sym: $@" if $@;
delete $DB::sub{$sym};
{ no strict 'refs';
if ($sym =~ /^(.*::)(.*?)$/) {
delete *{$1}->{$2};
}
}
}
require 'bb.pm';
bb::ff();
bb.pm
Код:
package bb;
use strict;
print "load module BB\n";
sub ff {
print "AA\n";
};
1;
при запуске получаем Undefined subroutine &bb::ff хотя видно что require отработал, так как есть вторая запись load module BB
Код:
$ ./a.pl
load module BB
INC strict.pm /usr/local/lib/perl5/5.10.0/strict.pm
INC bb.pm bb.pm
sym=bb::BEGIN
sym=bb::ff
AA
after delete $INC{'bb.pm'}
INC strict.pm /usr/local/lib/perl5/5.10.0/strict.pm
delete subrotine bb::BEGIN
delete subrotine bb::ff
load module BB
Undefined subroutine &bb::ff called at ./a.pl line 34
почему не появилась функция bb::ff если файл bb.pm был исполнен?