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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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