Как я могу принудительно выгрузить модуль Perl?

Привет я использую скрипт perl, написанный другим человеком, который больше не находится в компании. Если я запускаю сценарий как автономный, то выходные данные, как и ожидалось. Но когда я вызываю скрипт из другого кода несколько раз, вывод неверен, за исключением первого раза.

Я подозреваю, что некоторые переменные не инициализированы правильно. Когда он называется автономным, каждый раз, когда он выходит, и все значения переменных инициализируются по умолчанию. Но когда вызывается из другого скрипта perl, модули и значения переменных, вероятно, переносятся на следующий вызов скрипта.
есть ли способ очистить вызываемый скрипт от памяти, прежде чем я вызову его в следующий раз?

Я попытался включить предупреждение, и он бросал 1000 строк предупреждения...!

EDIT: как я вызываю другой скрипт:

код выглядит так:

do "processing.pl";
...
...
...

process(params); #A function in processing.pl
...
...
...

6 ответов


Если вы не хотите переписывать/исправлять скрипт, я предлагаю вызвать скрипт через exec() или одна из ее разновидностей. Хотя это не очень элегантно, это определенно исправит вашу проблему.


Если вы хотите принудительно перезагрузить модуль, удалите его запись из %INC а затем перезагрузите его.

например:

sub reload_module { 
    delete $INC{'Your/Silly/Module.pm'};
    require Your::Silly::Module;
    Your::Silly::Module->import;
}

обратите внимание, что если этот модуль полагается на глобалы в других устанавливаемых модулях, их также может потребоваться перезагрузить. Нет простого способа узнать это, не набрав пика в коде.


Привет я использую скрипт perl, написанный другим человеком, который больше не находится в компании. Я попытался включить предупреждение, и он выбрасывал 1000 строк предупреждения...!

вот в чем твоя проблема. Сценарий был написан неправильно и должен быть переписан.

задайте себе этот вопрос: если он имеет 1000 предупреждений, когда вы включаете строгую проверку, как вы можете быть уверены, что он делает правильную вещь? Как вы можете быть уверены, что это не clobbering файлы, разгром наборов данных, делая беспорядок вашей файловой системы? Скорее всего, он делает все это намеренно или случайно.

Я бы не доверял запуску сценария с ошибкой, написанного кем-то, кто больше не работает в компании. Я перепишу его и буду уверен, что он делает то, что мне нужно.


выгрузка модуля является более сложной задачей, чем просто удаление записи %INC модуля. Взгляните на Class:: Unload из CPAN.


вы уверены, что вам нужно перезагрузить модуль? Используя do, Вы читаете источник каждый раз и выполняете его. Что произойдет, если вы измените это на require, который будет читать и оценивать Источник только один раз?


другая возможность (просто думая вслух здесь) может быть связана с локальным каталогом? Они бегут из одного места. Наверное, не получилось с первого раза.

другой вариант-использовать system ('doprocessing.pl');. Лениво мы делаем это с помощью нескольких скриптов, чтобы принудительно повторно инициализировать ряд классов / переменных и т. д. И заставить файлы журнала вращаться правильно.

edit: я только что перечитал ваш вопрос, и казалось бы, что вы его не вызываете вроде этого.