我有一个模块,它使用许多(独立的)模块,所有这些模块都具有相同的属性(本地化对象的句柄)。我没有将该属性添加到所有类中,而是将该属性移动到角色中,然后由所有顶级类使用该属性。
不幸的是,现在我得到了致命的错误“尝试重新加载‘角色’中止”+“编译失败在要求在模块/运行时行317”。
我已经做了双重和三次检查,我没有在所有的类中使用这个角色超过一次,但是对于如何解决这个问题和发现错误,我有点困惑。由于这在早期(在开始/开始之前)就失败了,所以现在(我知道)也有方法来调试它。
Moo类层次结构和消费看起来基本如下(这是发布所有内容的大量代码的方法,但仍然太多):
主类:
SwitchInfo.pm: use Foo::SwitchInfo::DeviceIdent;
SwitchInfo.pm: use Foo::SwitchInfo::Factory;
SwitchInfo.pm: use Foo::SwitchInfo::L10N;
SwitchInfo.pm: use Moo;角色:
SwitchInfo/Role/L10N.pm: use Moo::Role;一级的独立类:
SwitchInfo/L10N: use base 'Locale::Maketext';
SwitchInfo/StackTable.pm: use Moo;
SwitchInfo/StackTable.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/DeviceIdent.pm: use Moo;
SwitchInfo/DeviceIdent.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/NameTable.pm: use Moo;
SwitchInfo/NameTable.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/Factory.pm: use Moo;
SwitchInfo/Factory.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/AliasTable.pm: use Moo;
SwitchInfo/AliasTable.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/Domain.pm: use Moo;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::AliasTable;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::Domain;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::NameTable;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::StackTable;
SwitchInfo/Driver.pm: use Moo;
SwitchInfo/Driver.pm: with 'Foo::SwitchInfo::Role::L10N';子类到第二级类:
SwitchInfo/Driver/Cisco.pm: use Moo;
SwitchInfo/Driver/Cisco.pm: extends 'Foo::SwitchInfo::Driver';
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Domain;
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Driver::Extreme::NameTable;
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Driver::Extreme::StackTable;
SwitchInfo/Driver/Extreme.pm: use Moo;
SwitchInfo/Driver/Extreme.pm: extends 'Foo::SwitchInfo::Driver';
SwitchInfo/Driver/Extreme/StackTable.pm: use Moo;
SwitchInfo/Driver/Extreme/StackTable.pm: extends 'Foo::SwitchInfo::StackTable';
SwitchInfo/Driver/Extreme/NameTable.pm: use Moo;
SwitchInfo/Driver/Extreme/NameTable.pm: extends 'Foo::SwitchInfo::NameTable';当尝试使用main类时,我得到以下错误:
$ cat sw.pl
use strict;
use warnings;
use lib './lib';
use Foo::SwitchInfo;
$
$ perl sw.pl
Attempt to reload Foo/SwitchInfo/Role/L10N.pm aborted.
Compilation failed in require at /opt/perl5/lib/perl5/Module/Runtime.pm line 317.
Compilation failed in require at lib/Foo/SwitchInfo.pm line 3.
BEGIN failed--compilation aborted at lib/Foo/SwitchInfo.pm line 3.
Compilation failed in require at sw.pl line 5.
BEGIN failed--compilation aborted at sw.pl line 5.
$ Foo/SwitchInfo.pm的主管是(行号):
1 package Foo::SwitchInfo;
2
3 use Foo::SwitchInfo::DeviceIdent;
4 use Foo::SwitchInfo::Factory;
5 use Foo::SwitchInfo::L10N;
6 use Types::Standard qw/ ArrayRef InstanceOf Str /;
7 use Type::Utils qw/ as coerce declare from via /;
8
9 use Foo::SNMP;
10
11 use Moo;
12 use namespace::clean;整个角色是这样的:
package Foo::SwitchInfo::Role::L10N;
use Types::Standard qw/ InstanceOf /;
use Moo::Role;
has l10n => (
is => 'ro',
isa => InstanceOf['Foo::SwitchInfo::L10N'],
handles => qw/ maketext /,
required => 1,
);
1;一个小的测试脚本已经验证了在几个类中使用一个角色,然后在另一个类中使用这些类是没有问题的。
如果有人还在看这篇长篇文章,你会发现有什么问题吗?或者这个角色的使用是它应该使用的吗?这是我第一次(真正的)尝试使用一个角色,所以我可能已经越界了。
发布于 2014-03-13 11:44:26
发现了错误。结果,我在角色中的“句柄”指令中出现了一个错误。
是
handles => qw/ maketext /,应该是
handles => [ qw/ maketext / ],通过跑
perl -c lib/Foo/SwitchInfo/Role/L10N.pm谁大声抱怨
Can't locate maketext.pm in @INChttps://stackoverflow.com/questions/22376023
复制相似问题