Perl MooseX::别名、不可变和循环的编译时问题';使用';

Perl MooseX::别名、不可变和循环的编译时问题';使用';,perl,moose,Perl,Moose,我得到一个编译时错误(Moose抱怨修改了一个不可变的实例) 在包上运行“perl-c”,但使用包的代码运行时没有错误。 示例代码: 文件Pa_1.pm(使用MooseX::Alias和包Pa_2.pm的不可变Moose类): 文件Pa_2.pm(仅使用使用Pa_2.pm的Pa_1.pm): 文件run_pa_1.pl: #!/usr/bin/env perl use Pa_1; my $pa1 = Pa_1->new(); print "Done !\n"; 执行run_pa_1.

我得到一个编译时错误(Moose抱怨修改了一个不可变的实例) 在包上运行“perl-c”,但使用包的代码运行时没有错误。 示例代码:

文件Pa_1.pm(使用MooseX::Alias和包Pa_2.pm的不可变Moose类):

文件Pa_2.pm(仅使用使用Pa_2.pm的Pa_1.pm):

文件run_pa_1.pl:

#!/usr/bin/env perl

use Pa_1;

my $pa1 = Pa_1->new();
print "Done !\n";
执行run_pa_1.pl是可行的,但“perl-cpa_1.pm”会

The 'add_method' method cannot be called on an immutable instance at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class/Immutable/Trait.pm line 32.
        Class::MOP::Class::Immutable::Trait::_immutable_cannot_call('add_method') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class/Immutable/Trait.pm line 47
        Class::MOP::Class:::around('CODE(0xc10158)', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'DESTROY', 'Moose::Meta::Method::Destructor=HASH(0x14af4f8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Method/Wrapped.pm line 162
        Class::MOP::Method::Wrapped::__ANON__('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'DESTROY', 'Moose::Meta::Method::Destructor=HASH(0x14af4f8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Method/Wrapped.pm line 91
        Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::SERIAL::1::add_method('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'DESTROY', 'Moose::Meta::Method::Destructor=HASH(0x14af4f8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Mixin/HasMethods.pm line 181
        Class::MOP::Mixin::HasMethods::_restore_metamethods_from('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class.pm line 405
        Class::MOP::Class::_restore_metaobjects_from('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Meta/Class.pm line 728
        Moose::Meta::Class::_restore_metaobjects_from('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class.pm line 65
        Class::MOP::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'error_class', 'Moose::Error::Default', 'wrapped_method_metaclass', 'Class::MOP::Method::Wrapped', 'instance_metaclass', 'Moose::Meta::Instance', 'method_metaclass', ...) called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Meta/Class.pm line 188            Moose::Meta::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'attribute_metaclass', 'Moose::Meta::Class::__ANON__::SERIAL::2') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Util/MetaRole.pm line 99            Moose::Util::MetaRole::_make_new_metaclass('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'HASH(0x144f868)', 'class') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Util/MetaRole.pm line 28            Moose::Util::MetaRole::apply_metaroles('for', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'class_metaroles', 'HASH(0x144f868)', 'role_metaroles', 'HASH(0x144f838)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Exporter.pm line 543
        Moose::Exporter::_apply_metaroles('Pa_1', 'ARRAY(0x93c630)', 'CODE(0xddccc8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Exporter.pm line 460
        Moose::Exporter::__ANON__('MooseX::Aliases') called at Pa_1.pm line 6
        Pa_1::BEGIN() called at Pa_1.pm line 6
        eval {...} called at Pa_1.pm line 6
BEGIN failed--compilation aborted at Pa_1.pm line 6.
我有点困惑,因为在Pa_2.pm上使用compile开关启动perl时会发出一个错误,但运行时似乎没有问题

  • 在调试器和“使用Pa_2”中也没有错误
  • 执行'perl-c run_pa_1.pl'也没有错误
  • 是否不使用MooseX::别名 使Pa_1.pm不可变让“perl-cpa_1.pm”编译时不会出错
代码中是否有bug,MooseX::Alias中是否有bug,或者它是Moose内部的东西


使用的版本:perl 5.16.1;驼鹿2.0604;MooseX::别名0.10

下午1:00点菜对你有用吗

package Pa_1;

use Moose;
use MooseX::Aliases;

use Pa_2;

__PACKAGE__->meta->make_immutable;

我认为将所有的
Moose
模块放在第一位通常是明智的。

不要直接执行模块。最后编译并执行它两次

perl -c Pa_1.pm
同样,不要直接编译模块。你最终编译了两次

perl -c Pa_1.pm
应该

perl -c -e'use Pa_1;'
perl-cpa_1.pm
执行以下操作(忽略不执行任何操作的
require
import
):

perl-c-e'use Pa_1执行以下操作(忽略不执行任何操作的
require
import
):

注意你最后是怎么做的

import Moose;
import MooseX::Aliases;
之后

__PACKAGE__->meta->make_immutable;

当你做错的时候

是的,它有效。这是否意味着,这不是代码中的错误,但是Moose/Moose模块依赖于调用顺序?回答得很好(和往常一样;-)-谢谢。我想我明白了。如果执行'perl-cpa_1.pm'(继续上面的注释),则执行两次Pa_1.pm。一次执行用于直接调用它,另一次执行用于在Pa_2.pm中执行“use Pa_1”,这不会被抑制,因为之前没有“use Pa_1”。并且MooseX::Alieses尝试修改该类。如果在Pa_1.pm和debug.Close中插入“BEGIN{$DB::single=1}”行,则可以跟踪执行
perl-cpa_1.pm
编译
Pa_1.pm
两次,但只执行一次。(当
perl
直接“调用”时编译,当
use
调用时编译并执行)
perl Pa_1.pm
将编译并执行两次。
package Pa_1;
require Pa_2;

package Pa_2;
1;

package Pa_1;
require Moose;
import Moose;
require MooseX::Aliases;
import MooseX::Aliases;
__PACKAGE__->meta->make_immutable;
1;
import Moose;
import MooseX::Aliases;
__PACKAGE__->meta->make_immutable;