Вы не предоставили достаточно информации, чтобы быть полностью уверенным в проблеме, но наиболее вероятной причиной является то, что new
к югу находится в пакете, кроме genbank
.
При попытке вызова genbank::new
(или genbank->new
), Perl ищет замену имени new
в пакете genbank
, не в файле genbank.pm
. По соглашению, файл genbank.pm
будет содержать пакет с именем genbank
, но это исключительно вопрос согласия и удобства. Это не, введенный в действие этим языком, и существует абсолютно нет автоматическое соединение между именами файлов и именами пакетов.
Чтобы узнать, в какой упаковке размещены ваши подсайты, посмотрите на genbank.pm
для любых строк, содержащих package xxxx;
. Последний, который появится перед линией sub new
, сообщит вам пакет, к которому принадлежит new
. Если перед его определением нет инструкции package
, она по умолчанию будет в пакете main
.
(Если вы несете ответственность за исходный код genbank.pm
, я бы также предложил либо добавить package genbank;
в файл, либо переименовать файл в соответствии с пакетом, который он фактически содержит, чтобы избежать такого рода путаницы в будущем.)
Редактировать в ответ на комментарий OP в:.
Поскольку в настоящее время модуль начинается с package MRS::Scripts::genbank
, то это уПАКОВКИ new
югу создается у вас есть два варианта для вызова его:
Назовите его MRS::Scripts::genbank::new
(или, если он фактически является конструктором объекта, MRS::Scripts::genbank->new
). Если вы хотите называть его с помощью имени пакета, вы должны использовать правильное имя пакета.
Экспорт его из MRS::Scripts::genbank
пакета и изменить вызывающий скрипт для импорта символов из этого пакета (либо путем перемещения genbank.pm
к MRS/Scripts/genbank.pm
и изменение require
к use MRS::Scripts::genbank;
или путем добавления MRS::Scripts::genbank->import;
после require
), а затем вызвать его как только new()
. Хотя это будет работать в рамках ограниченного объема вашего вопроса, я рекомендую против, потому что, как только вы повторите это с другим модулем, содержащим sub new
, все будет разваливаться, так как не может быть двух new
s на в то же время в одном и том же месте.
Чистейшая способ решить эту проблему будет двигаться genbank.pm
к MRS/Scripts/genbank.pm
, изменить ваш require
к require MRS::Scripts::genbank.pm
(или use
, если вы ничего не экспортируют, они эквивалентны), а затем вызвать к югу, как MRS::Scripts::genbank::new
или MRS::Scripts::genbank->new
. Такой подход позволит синхронизировать имя файла и имя пакета друг с другом, что облегчит жизнь тем, кто должен поддерживать код в будущем (что, вероятно, будет вам ...).
Что происходит, когда вы используете genbank; 'вместо' require ...'? Внутри 'genbank.pm', есть ли' пакет genbank', 'декларация в верхней части? – amon
Нет, объявление пакета в genbank.pm является «пакетом MRS :: Scripts :: genbank», это единственное объявление пакета в файле genbank.pm. Итак, что дальше? – wuchang
Не имеет значения, чтобы перейти от «require ...» к «use ...». – wuchang