Я сейчас экспериментирую с перезагрузкой модуля. Цель, которую я надеюсь достичь, - это иметь возможность изменить что-то в определенной подпрограмме в файле модуля, а затем перезагрузить этот модуль, используя новые определения.
В настоящее время я изменяю оператор print в подпрограмме test
для печати «это какой-то другой текст» после ожидания выполнения подпрограммой исходного кода и до перезагрузки модуля.
Однако в настоящее время я получаю сообщение:
Subroutine test redefined at /Test/testmodule.pm line 9.
Это именно то, что я хочу, но вывод выглядит следующим образом.
this is some text
Subroutine test redefined at /Test/testmodule.pm line 9.
this is some text
Я надеюсь, что когда модуль будет перезагружен и он поймет, что подпрограмма была переопределена, он при следующем выполнении подпрограммы test будет ссылаться на новое определение, а не на старое.
Я просматривал предыдущие вопросы о перезагрузке модулей, но были даны такие ответы, как зацикливание зависимостей (пакет A использует B, а B использует A) или столкновение пространства имен в пакетах, но здесь это не проблема. , Я хочу, чтобы подпрограмма была переопределена, и использовалось новое определение.
исходный код:
main.pl
#!/usr/bin/perl
use strict;
use warnings;
use Module::Reload::Selective;
use Test::testmodule;
while(1) {
test(); #run module's define subroutine
sleep(5); #stop terminal from being flooded too quickly
#Ensure that the module is reloaded
$Module::Reload::Selective::Options->{SearchProgramDir} = 1;
$Module::Reload::Selective::Options->{ReloadOnlyIfEnvVarsSet} = 0;
Module::Reload::Selective->reload(qw(Test::testmodule)); #reload!
}
исходный код: testmodule.pm (в ./Test/
относительно main.pl )
#!/usr/bin/perl
use strict;
use warnings;
# allow exportation
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(test);
sub test {
print("this is some text\n"); # this line is edited in the source file to
# 'print("this is some different text\n");'
}
1;
Любые указатели или ссылки на учебники были бы блестящими. На самом деле, если ответ не невероятно прост, то если я не скажу ответ напрямую, я смогу прочитать предложенный вами материал и получить более полное понимание.
Все необходимые модули CPAN установлены, и я могу подтвердить, что testmodule.pm успешно записывается после изменения.
OS : Scientific Linux CERN 6, версия ядра 2.6.32-131.4.1.el6.x86_64
Perl : v5.10.1 (*) для x86_64-linux-thread-multi
Большое спасибо заранее,
Оуэн.