Я ломал голову около часа, пытаясь заставить .pm работать как модуль для меня.
Моя проблема довольно проста.
История:
- Я сделал пакет и использовал Moose для ООП.
- Я сохранил пакет My::FileIO в домашнем каталоге в общем каталоге для всех таких пользовательских модулей в форме /home/USER/DIRECTORY/My/FileIO.pm. Фактически, это было сделано после того, как я использовал Module::Starter и использовал
perl Makefile.PL
, который установил его в этом формате. - Я использовал внешний скрипт для тестирования модуля. В этом я использовал
use lib '/home/USER/DIRECTORY/'
, а затем подтвердил наличие модуля, проверив%INC
, что дало правильное значение имени файла. Это привело меня к выводу, что Perl загрузил модуль без каких-либо жалоб. - Я пытался использовать этот модуль
My::FileIO
, и скрипт тестирования в то время также не жаловался. - Сценарий тестирования не удался после того, как я использовал конструктор по-лосячьи,
my $test = My::FileIO->new()
и вот что он выдал -Can't locate object method "new" via package "My::FileIO" (perhaps you forgot to load "My::FileIO"?) at line 1.
- Я попытался создать фиктивную подпрограмму с именем
init
, но она тоже не удалась. - Однако автору Perl Maven удалось использовать эти коды (https://perlmaven.com/object-Oriented-perl-using-moose)
Его тестовый сценарий
use strict;
use warnings;
use v5.10;
use Person;
my $teacher = Person->new( name => 'Joe' );
say $teacher->name;
Его тестовый модуль
package Person;
use Moose;
has 'name' => (is => 'rw');
1;
Резюме:
- Сценарий тестирования может успешно загрузить модуль.
- Я вообще не могу пользоваться пакетом.
Это предполагаемый FileIO.pm
package My::FileIO;
use feature 'state';
use List::Util qw(max);
use Data::Dumper;
use Moose;
use Type::Params qw(compile);
use Type::Utils;
use Types::Standard qw(Str FileHandle Int HashRef ArrayRef Maybe);
[ ALL THE CODE ]
1;
Полный код находится по адресу https://pastebin.com/1kxiPazd.
Это мой тестовый файл - test.pl
use lib '/home/USER/DIRECTORY';
use My::FileIO;
$test = My::FileIO->new() # Fails
Что я делаю не так? Я сделал фиктивный модуль, такой как Perl Maven, и попытался его протестировать, но он тоже не удался.
Обновление - прошу прощения за глупые ошибки в моей записи.
new
, а не вuse
, он находит файл в порядке. Вы уверены, что имя пакетаMy::FileIO
, имя файлаMy/FileIO.pm
и имя класса, для которого вы вызываетеnew
, правильно совпадают? Включая различия с прописными и строчными буквами? - person tobyink   schedule 11.10.2020/home/USER/DIRECTORY
), более разумно использовать env varPERL5LIB
(export PERL5LIB=/home/USER/DIRECTORY
), чем использоватьuse lib
. - person ikegami   schedule 11.10.2020Can't locate object method "new" via package "My::Test" (perhaps you forgot to load "My::Test"?) at line 1.
, которое ссылается на совершенно другое имя класса (My::Test вместо My::FileIO), поэтому я не уверен, что вы используете правильное имя класса. - person tobyink   schedule 11.10.2020state $check = compile($sometype); my $somevar = shift; $check->($mode);
но вы можете просто сделать это:my $somevar = $sometype->(shift);
и это будет намного быстрее.compile
предназначен для создания проверки для проверки всего@_
сразу; это мега-излишняя проверка только одной переменной. - person tobyink   schedule 11.10.2020My::FH
. Я создал каталог с именемMy
и поместил в него этот файл с именемFH.pm
. Когда я загружаю этот модуль (use My::FH;
) и создаю объект, он работает без проблем. Я не знаю, в чем вы ошибаетесь, но, скорее всего, это касается именования и размещения. Возможно, см. этот пост - person zdim   schedule 11.10.2020use FindBin qw($RealBin); use lib $RealBin;
. Теперь вы можете сказатьuse My::FH;
(если в каталоге вашего скрипта есть каталогMy
, а в немFH.pm
). (2) Чтобы создать объект в этом модуле, вам нужноMy::FH->new(filename => valid_file_name);
. Поэтому вы должны указать допустимое имя файла (такой файл должен существовать) - person zdim   schedule 11.10.2020