2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Perl перезагрузка модуля
Сообщение14.06.2011, 18:46 
Аватара пользователя


26/01/09
137
made in USSR
Дано - скрипт 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 был исполнен?

 Профиль  
                  
 
 Re: Perl перезагрузка модуля
Сообщение17.06.2011, 22:50 


28/09/09
29
Код:
#!/usr/bin/perl -w
use bb;

ff();

Код:
package bb;
use Exporter;
@ISA = ('Exporter');
@EXPORT = qw(&ff);

print "load module BB\n";

sub ff {
   print "AA\n";
};
1;

 Профиль  
                  
 
 Re: Perl перезагрузка модуля
Сообщение19.06.2011, 18:13 
Аватара пользователя


26/01/09
137
made in USSR
лишь бы что написать - тролли проклятые

 Профиль  
                  
 
 Re: Perl перезагрузка модуля
Сообщение19.06.2011, 18:32 


28/09/09
29
dp в сообщении #459895 писал(а):
лишь бы что написать - тролли проклятые

Можно без экспорта юзать функции из пакета?

 Профиль  
                  
 
 Re: Perl перезагрузка модуля
Сообщение19.06.2011, 20:22 
Аватара пользователя


26/01/09
137
made in USSR
RTFM, тут не про это, если это вопрос его надо задавать отдельной темой

 Профиль  
                  
 
 Re: Perl перезагрузка модуля
Сообщение19.06.2011, 20:33 


28/09/09
29
dp в сообщении #459973 писал(а):
RTFM, тут не про это, если это вопрос его надо задавать отдельной темой

Что ты хочешь, когда модуль неправильно написан.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Missir


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group