Как я могу принудительно выгрузить модуль Perl? - PullRequest
9 голосов
/ 03 августа 2009

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

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

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

РЕДАКТИРОВАТЬ: Как я вызываю другой сценарий:

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

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

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

Ответы [ 6 ]

11 голосов
/ 03 августа 2009

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

Например:

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

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

8 голосов
/ 03 августа 2009

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

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

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

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

5 голосов
/ 03 августа 2009

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

4 голосов
/ 03 августа 2009

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

3 голосов
/ 04 августа 2009

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

0 голосов
/ 03 августа 2009

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

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

edit: Я только что перечитал ваш вопрос, и может показаться, что вы не так его называете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...