【发布时间】:2014-10-06 05:35:37
【问题描述】:
我正在使用 Moo 编写我的第一个真正的 Perl 模块。但是我对包位置和包声明以及“使用”感到困惑。
我在 c:/temp: 中有一个简单的程序
use Roadmap::a;
print a->new->aa->[0] . "\n";
我有一个简单的模块 C:/bin/perl/perl/site/lib/Roadmap/a.pm,@INC 有:
@INC:
C:/bin/perl/perl/site/lib
C:/bin/perl/perl/vendor/lib
C:/bin/perl/perl/lib
.
如果 a.pm 是这样的:
package Roadmap::a;
use Moo;
use Types::Standard qw(ArrayRef);
has aa => (is => 'rw', isa => ArrayRef, default => sub{ [3] });
1;
它返回一个错误:
Can't locate object method "new" via package "a"
(perhaps you forgot to load "a"?) at e.pl line 2.
但如果 a.pm 是这样的:
package a;
use Moo;
use Types::Standard qw(ArrayRef);
has aa => (is => 'rw', isa => ArrayRef, default => sub{ [3] });
1;
它成功并返回答案'3'。我究竟做错了什么?不应该所有模块都有 Somedir::Module 的名称吗?谢谢!
更新:这个模块非常简单,我所做的只是创建目录 site/lib/Roadmap 并将 a.pm 文件放入其中。我是否应该尝试在这个简单的模块上安装某种 perl 模块?对于这个简单的示例,我似乎不需要这样做。
更新:如果我将“a->new()”替换为“Roadmap::a->new()”,那么我的原始示例将有效。但我希望通过 Somedir::Module 包,在我的脚本中执行“使用 Somedir::Module”之后,我可以只执行 Module->new() 而不是 Somedir::Module->new()。
更新:继续与我自己对话,如果我将脚本更改为这种格式,一切都会按照我想要的方式进行。 (当然,在实践中我永远不会使用小写的模块名称,这只是为了测试。)
use aliased 'Roadmap::a';
print a->new->aa->[0] . "\n";
所以我想我现在已经回答了我自己的问题。
【问题讨论】:
标签: perl-module