Подпрограммы переопределили ошибку в Perl - PullRequest
1 голос
/ 24 февраля 2011

EDIT:

Краткий обзор каждого модуля. (Я предполагаю, что это правильный способ добавить больше информации к моему сообщению. Приносим свои извинения, поскольку я публикую это впервые)

A.pm - Содержит подпрограммы многократного использования для чтения ZIP-файла, дешифрования содержимого, проверок и т. Д. (Используется различными файлами CGI, сценариями командной строки и другими модулями Perl)

B.pm - это файл Utils, который подключается к БД, ко всем подпрограммам, связанным с SQL, вызывает C.pm для записи меток в каждый файл

C.pm - Специализированная процедура для маркировки каждого файла в ZIP аналогично контрольной сумме (проверка разрешенных типов файлов, чтение файлов, запись файлов, проверка и т. Д.), Использует A.pm, поскольку модуль должен расшифровывать содержимое, выполнить проверки, сделанные A.pm

Включая некоторый пример кода (я просто публикую здесь несколько строк использования; очевидно, многие модули используются в .pm)

A.pm

package A;
use strict;
use warnings;
use B;
..........
B::get_database_information_for_file(..)
..........
sub validate_decrypted_mark { ...... }
sub decrypt_mark {..........} 

.....

B.pm

package B;
use strict;
use warnings;
use C;
..........
C::mark_file(..)
..........
sub db_connect { ...... }
sub get_database_information_for_file {..........} 

.....

C.pm

package C;
use strict;
use warnings;
use A;
..........
A::decrypt_mark(..)
..........
sub mark_file { ...... }
sub read_mark {..........} 
sub write_mark {..........} 
sub examine_mark {..........} 

.....

Еще немного дополнительной информации (которая может быть полезна)

  • Эти предупреждения появляются, когда мы недавно перешли с Solaris / Apache на LAMP.

  • Мы используем mod_perl, поэтому возможно, что модуль уже находится в памяти?

=====

Здравствуйте,

Я искал в переполнении стека и нашел основную причину моей проблемы.

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

Но у меня другая ситуация, чем та, которая указана в приведенной выше теме. Моя проблема заключается в том, что я получаю подпрограмму переопределена ошибка в Perl (так же, как тот, который указан в приведенном выше поток). Но мой вопрос касается круговой ссылки и / или лучших практик. У меня следующий сценарий, который приводит к переопределению подпрограммы предупреждение

Пакет A - использует -> Пакет B - использует -> Пакет C - использует -> Пакет A

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

Я не могу избежать этих ссылок, поскольку Пакет C должен использовать подпрограммы, определенные в Пакете A. У Гранта Маклина было очень хорошее предложение в вышеупомянутой теме для моей ситуации, описанной выше. Я не хотел бы избегать этих предупреждений, поскольку они могут указывать на некоторые проблемы.

Очень ценю ваше время и помощь.

Благодарю вас,

1 Ответ

4 голосов
/ 25 февраля 2011

Циркулярное использование обычно не должно давать вам переопределенное предупреждение подпрограммы, если вы не выполняете один из пакетов напрямую, вместо того, чтобы использовать use / require. Иногда люди пытаются проверить синтаксис следующим образом:

perl -c Foo.pm

Вместо этого они должны сделать

perl -e'use Foo'

Так можете ли вы точно рассказать, что вы делаете, чтобы спровоцировать подпрограмму переопределить предупреждения?

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