【问题标题】:perl package statement and perl module locationsperl 包语句和 perl 模块位置
【发布时间】: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


    【解决方案1】:

    “使用别名”很好地解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多