在Perl脚本中“使用”基于Moose的软件包

问题描述

为了准备一个.pm作为我的模块,我已经head了一个小时。

我的问题很简单。

故事:

  1. 我制作了一个程序包,并将Moose用于OOP。
  2. 我已将包My :: FileIO保存在主目录下的所有此类自定义模块的公共目录下,格式为/home/USER/DIRECTORY/My/FileIO.pm。实际上,这是在我使用Module :: Starter并使用perl Makefile.PL以该格式安装它之后完成的。
  3. 我使用了外部脚本来测试模块。这样,我使用了use lib '/home/USER/DIRECTORY/',然后通过检查产生正确文件名值的%INC来确认模块的存在。这使我得出结论,Perl毫无疑问地加载了该模块。
  4. 我尝试通过My::FileIO使用此模块,并且测试脚本当时也没有抱怨。
  5. 我以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.
  6. 我试图制作一个名为init的模拟子程序,但是它也失败了。
  7. 但是,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;

摘要:

  1. 测试脚本能够成功加载模块。
  2. 我根本无法使用该包裹。

这是假定的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类的对象。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...