컴파일 시간 오류가 발생합니다 (변경 가능 인스턴스를 수정하는 것에 대해 무스가 불평합니다) 패키지에서 'perl -c'를 실행하지만 패키지를 사용하는 코드는 오류를 실행합니다. -비어 있는. 예제 코드 : (단지 Pa_1.pm 사용MooseX :: Aliases의 컴파일 시간 문제, 불변 및 순환 '사용'
package Pa_1;
use Pa_2;
use Moose;
# uncommenting either this line ...
use MooseX::Aliases;
# ... or this line to make 'perl -c' work
__PACKAGE__->meta->make_immutable;
1;
파일 Pa_2.pm Pa_2.pm을 사용
파일 Pa_1.pm (MooseX :: 별칭 및 패키지 Pa_2.pm를 사용하여 불변 무스 클래스)) :
package Pa_2;
use Pa_1;
1;
파일 run_pa_1.pl :
#!/usr/bin/env perl
use Pa_1;
my $pa1 = Pa_1->new();
print "Done !\n";
run_pa_1.pl 작업을 실행하지만, '펄 -c Pa_1.pm은 '오류가 컴파일 스위치 Pa_2.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 사용'도 오류가 없습니다.
- 'perl -c run_pa_1.pl'을 실행해도 오류가 없습니다.
- MooseX :: Aliases를 사용하지 않거나 Pa_1.pm을 변경할 수 없도록 설정하면 'perl -c Pa_1.pm'이 오류없이 컴파일됩니다.
코드에있는 MooseX :: Aliases에 버그가 있습니까? 아니면 무언가에 뭔가 있습니까?
사용 된 버전 : perl 5.16.1; 무스 2.0604; MooseX :: Aliases 0.10;
훌륭한 답변 (평소와 마찬가지로 ;-)) - 감사합니다. 나는 그 점을 알고 있다고 생각한다. 'perl -c Pa_1.pm' – katastrophos
(위에서 계속되는 주석)을 실행하면 Pa_1.pm이 두 번 실행됩니다. 직접 호출하는 하나의 실행과 Pa_2.pm에서 'use Pa_1'에 대한 하나의 실행. 이전에는 'Pa_1 사용'이 없었기 때문에 표시되지 않았습니다. MooseX :: Alieses는 클래스 수정을 시도합니다. Pa_1.pm에 'BEGIN {$ DB :: single = 1}'행을 넣고 디버그하면 실행을 따라갈 수 있습니다. – katastrophos
닫기. 'perl -c Pa_1.pm'은'Pa_1.pm'을 두 번 컴파일하지만 한번만 실행합니다. ('perl'에 의해 직접 호출되면 컴파일되고,'used'에 의해'called "될 때 컴파일되고 실행됩니다.)'perl Pa_1.pm'은 두 번 컴파일되어 실행됩니다. – ikegami