Я задавал этот вопрос раньше или искал, и видел, как другие спрашивают - почему я получаю предупреждение " Подпрограмма mySub переопределена в строке ../lib/Common.pm x "? и вы всегда получаете ответ , который вы объявили дважды дважды в одном и том же коде . Я создал этот тестовый пакет:
ВСЁ ФАЙЛ ---------------
package MyCommonPkg;
use strict;
sub thisSubroutineIsNotDefinedAnywhereElse{
}
1;
ВСЁ ФАЙЛ ---------------
и Я использую этот пакет из сценария perl, который использует другие пакеты, которые также используют этот пакет, и я получаю предупреждение:
Подпрограмма ThisSubroutineIsNotDefinedAnywhereElse переопределена в строке 19 ../lib/MyCommonPkg.pm.
Я обещаю, что я не объявлял этот саб в другом месте. Так это вызвано круговой ссылкой? Как я могу отследить причину этого предупреждения и устранить его?
Если вы работаете в системе с файловой системой без учета регистра (Windows и довольно часто OSX), и вы используете Common
в одном файле и используйте общий
в другом, вы можете вызвать подобные проблемы.
Есть ли у вас цикл зависимостей? Если Perl начинает компиляцию вашего скрипта и встречает такую строку:
use PackageA;
Perl приостанавливает компиляцию вашего скрипта; находит PackageA.pm и начинает его компилировать. Если он встречает такую строку:
use PackageB;
Perl приостанавливает компиляцию PackageA; находит PackageB.pm и начинает его компилировать.Обычно это завершается успешно, и Perl возвращается к завершению компиляции PackageA, а когда это завершается успешно, он возвращается к компиляции вашего скрипта, и когда это завершается успешно, он начинает выполнять скомпилированные коды операций.
Однако , если PackageB.pm содержит эту строку:
use PackageA;
Вы можете ожидать, что он ничего не сделает, поскольку Perl уже обработал PackageA.pm, но проблема в том, что он еще не завершен. Таким образом, Perl приостановит компиляцию PackageB и снова начнет компилировать PackageA.pm с самого начала. Это может вызвать сообщение о переопределении подпрограмм в PackageA.
Как правило, два пакета не должны зависеть друг от друга. Однако иногда петлю труднее найти, потому что она вызвана третьим пакетом.
Я попытался использовать "package Common.pm" в качестве имени пакета. Компилятор выдал мне ошибки. Очень любезно с его стороны, а? Какую версию Perl вы используете? Я пробовал на 5.10.0 и 5.12.1.
Даже если вы можете компилировать, хорошей практикой является удаление файла .pm. Например;
Файл: some_package.pm;
package some_package;
use strict;
sub yadayadayada { ... }
1;