问题描述
为了准备一个.pm作为我的模块,我已经head了一个小时。
我的问题很简单。
故事:
- 我制作了一个程序包,并将Moose用于OOP。
- 我已将包My :: FileIO保存在主目录下的所有此类自定义模块的公共目录下,格式为/home/USER/DIRECTORY/My/FileIO.pm。实际上,这是在我使用Module :: Starter并使用
perl Makefile.PL
以该格式安装它之后完成的。 - 我使用了外部脚本来测试模块。这样,我使用了
use lib '/home/USER/DIRECTORY/'
,然后通过检查产生正确文件名值的%INC
来确认模块的存在。这使我得出结论,Perl毫无疑问地加载了该模块。 - 我尝试通过
My::FileIO
使用此模块,并且测试脚本当时也没有抱怨。 - 我以Moose方式使用构造函数
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的模拟模块,并尝试对其进行测试,但是它也失败了。
更新- 对于撰写中的愚蠢错误,我深表歉意。
解决方法
假设您叫select count(distinct customer_id)
from t;
的文件的完整路径为FileIO.pm
,则在底部发布的内容将起作用。
您在底部发布的代码显然不是您在测试中使用的导致错误的代码。您提供的错误消息说您使用/home/USER/DIRECTORY/My/FileIO.pm
而不是-e
,并且错误消息说您尝试创建My :: Test类而不是My :: FileIO类的对象。