Perl - Подпрограмма переопределена

Я задавал этот вопрос раньше или искал, и видел, как другие спрашивают - почему я получаю предупреждение " Подпрограмма mySub переопределена в строке ../lib/Common.pm x "? и вы всегда получаете ответ , который вы объявили дважды дважды в одном и том же коде . Я создал этот тестовый пакет:

ВСЁ ФАЙЛ ---------------

package MyCommonPkg;

use strict;

sub thisSubroutineIsNotDefinedAnywhereElse{
}

1;

ВСЁ ФАЙЛ ---------------

и Я использую этот пакет из сценария perl, который использует другие пакеты, которые также используют этот пакет, и я получаю предупреждение:

Подпрограмма ThisSubroutineIsNotDefinedAnywhereElse переопределена в строке 19 ../lib/MyCommonPkg.pm.

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

27
задан user210757 3 May 2012 в 14:07
поделиться

3 ответа

Если вы работаете в системе с файловой системой без учета регистра (Windows и довольно часто OSX), и вы используете Common в одном файле и используйте общий в другом, вы можете вызвать подобные проблемы.

7
ответ дан 28 November 2019 в 04:30
поделиться

Есть ли у вас цикл зависимостей? Если 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.

Как правило, два пакета не должны зависеть друг от друга. Однако иногда петлю труднее найти, потому что она вызвана третьим пакетом.

34
ответ дан 28 November 2019 в 04:30
поделиться

Я попытался использовать "package Common.pm" в качестве имени пакета. Компилятор выдал мне ошибки. Очень любезно с его стороны, а? Какую версию Perl вы используете? Я пробовал на 5.10.0 и 5.12.1.

Даже если вы можете компилировать, хорошей практикой является удаление файла .pm. Например;

Файл: some_package.pm;

package some_package;
use strict;

sub yadayadayada { ... }

1;
0
ответ дан 28 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: