【问题标题】:'Use'ing Moose-based packages in Perl Scripts [closed]在 Perl 脚本中“使用”基于 Moose 的包[关闭]
【发布时间】:2021-01-25 14:39:35
【问题描述】:

我一直在摸索大约一个小时,试图让 .pm 成为我的模块。

我的问题很简单。

故事:

  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 的模拟模块并尝试对其进行测试,但它也失败了。

更新 - 对于我的文章中的愚蠢错误,我深表歉意。

【问题讨论】:

  • 如果它在new 失败而不是在use 失败,它可以找到文件。你确定包名My::FileIO、文件名My/FileIO.pm和你调用的类名new都正确对应吗?包括大小写的区别?
  • 提示:当您有一个安装模块的中心位置(即/home/USER/DIRECTORY)时,使用env var PERL5LIB (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


【解决方案1】:

假设您称为FileIO.pm 的文件的完整路径是/home/USER/DIRECTORY/My/FileIO.pm,您在底部发布的内容将起作用。

您在底部发布的代码显然不是您在测试中使用的导致错误的代码。你提供的错误信息说你使用了-e而不是test.pl,并且说你试图创建一个My::Test类的对象而不是My::FileIO。

【讨论】:

  • 对此我深表歉意。但是,当不使用 -e 时,它​​的作用类似。
  • 当您解决问题时,请随时告诉我。它仍然不包含您实际运行的代码。或者,提供cat test.pl; cat /home/USER/DIRECTORY/My/FileIO.pm; ./test.pl 的(未经编辑的)输出
  • 你可以查看完整的代码@ikegami。
  • 您尚未发布问题演示(最小或其他)。而且您已经知道如何解决您的问题:使用您在答案底部发布的代码。我不知道你做错了什么,因为 1)关于你实际运行的代码有太多相互矛盾的信息,2)你甚至没有提供你得到的错误信息。我不确定你还想要什么。
猜你喜欢
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2014-10-10
  • 2023-03-15
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多