Я пытаюсь создать ряд связанных классов в одном пространстве имен, но классы не могут найти друг друга.Perl - использовать связанные модули в иерархии пакетов
Я работаю в пространстве имён Crypt::HSXKPasswd
. Мои файлы .pm
находятся в правильных путях файлов в папке ./lib
(Crypt::HSXKPasswd
определяется в ./lib/Crypt/HSXKPasswd.pm
и т. Д.).
Внутри конструктора моего основного модуля (Crypt::HSXKPasswd->new
) Я пытаюсь создать объект типа Crypt::HSXKPasswd::Dictionary::Default
.
Мой тестовый файл находится в .
, и имеет следующее содержание:
#!/usr/bin/perl
use strict;
use warnings;
use lib './lib';
use Crypt::HSXKPasswd;
my $hsxkpasswd = Crypt::HSXKPasswd->new();
Он не выполняет со следующей ошибкой:
Can't locate Crypt::HSXKPasswd::Dictionary::Default in @INC (@INC contains: ./lib /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2/darwin-thread-multi-2level /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at lib/Crypt/HSXKPasswd.pm line 482.
Обратите внимание, что @INC
содержит ./lib
. Следующая команда главы показывает, что файл .pm
для модуля находится в правильном пути под ./lib
, и что он делает определить правильный пакет:
$ head -1 ./lib/Crypt/HSXKPasswd/Dictionary/Default.pm
package Crypt::HSXKPasswd::Dictionary::Default;
$
Если файл .pm
существует, определяет модуль, и расположена в правильном пути относительно папки в @INC
, почему Perl не видит его?
в вашем файле 'Crypt :: HSXKPasswd' вам нужно использовать Crypt :: HSXKPasswd :: Dictionary :: Default;' – KeepCalmAndCarryOn
'Crypt :: HSXKPasswd :: Dictionary :: Default' - имя пакета не было преобразовано для имени файла. Не могли бы вы опубликовать пару строк вокруг оператора использования (до изменения, которое исправило его)? Спасибо. – Dallaylaen
@ Dallaylaen - У меня больше нет сломанного кода, но это директива require, а не директива use, и если память служит, она использует строку, а не голые слова, и вполне может объяснить всю проблему. –