【发布时间】:2021-01-25 14:39:35
【问题描述】:
我一直在摸索大约一个小时,试图让 .pm 成为我的模块。
我的问题很简单。
故事:
- 我制作了一个包并使用 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 的模拟模块并尝试对其进行测试,但它也失败了。
更新 - 对于我的文章中的愚蠢错误,我深表歉意。
【问题讨论】:
-
如果它在
new失败而不是在use失败,它可以找到文件。你确定包名My::FileIO、文件名My/FileIO.pm和你调用的类名new都正确对应吗?包括大小写的区别? -
提示:当您有一个安装模块的中心位置(即
/home/USER/DIRECTORY)时,使用env varPERL5LIB(export PERL5LIB=/home/USER/DIRECTORY) 比使用use lib更有意义. -
我已经粘贴了实际代码的头部。 FileIO.Pm 的路径是 /home/USER/DIRECTORY/My/FileIO.pm 包含类 My::FileIO。
-
@user9111001 是的,但是你说你得到的错误消息是
Can't locate object method "new" via package "My::Test" (perhaps you forgot to load "My::Test"?) at line 1.它引用了一个完全不同的类名(My::Test 而不是 My::FileIO)所以我不相信你使用了正确的类名。 -
另外,检查你的完整代码,你似乎经常这样做:
state $check = compile($sometype); my $somevar = shift; $check->($mode);但你可以这样做:my $somevar = $sometype->(shift);,它会快很多。compile旨在用于创建检查以一次检查整个@_;只检查一个变量就太夸张了。
标签: perl perl-module moose