Perl 未加载@ISA中的包时多次发出相同警告

Perl 未加载@ISA中的包时多次发出相同警告,perl,perl-module,Perl,Perl Module,在重构我的一些perl代码时,我 注意到以下strang行为。 考虑这个小样本脚本: #!/usr/bin/perl -w package test; use strict; my $obj = bless( {}, __PACKAGE__); our @ISA = qw( missing ); exit(0) 预期的警告 显示三次,而不是仅显示一次。此警告的其他两个触发器是什么?这三个都指退出(0) GentooLinux上的perl版本5.12.4 谢谢。我相信tjd已经得到了答案。如

在重构我的一些perl代码时,我 注意到以下strang行为。
考虑这个小样本脚本:

#!/usr/bin/perl -w

package test;
use strict;
my $obj = bless( {}, __PACKAGE__);
our @ISA = qw( missing );

exit(0)
预期的警告

显示三次,而不是仅显示一次。此警告的其他两个触发器是什么?这三个都指退出(0)
GentooLinux上的perl版本5.12.4


谢谢。

我相信tjd已经得到了答案。如果向测试包中添加DESTROY()和AUTOLOAD()方法,则只会收到一条警告(关于缺少@test::ISA)

您通常需要确保@ISA列表中列出的包已经加载。在您的示例中,您可能希望看到以下内容:

   package test;  
   use strict;
   use missing;

   our @ISA = ('missing');
您的包没有显式的new()方法,这有点奇怪。相反,您有一个调用bless()的语句

如果您有一个新的()方法,如下所示:

   sub new() { return bless {}, __PACKAGE__; }
   package test;
   use strict;
   use warning;
   use base ('missing');

   sub new { bless {}, __PACKAGE__);
   sub DESTROY {}
   sub AUTOLOAD {}
   1;
然后,直到出现一个名为new()的消息,您才会看到三重错误消息

您可能希望使用pragma'base',这将给您一个致命错误,说明它无法加载'missing'包:

   package test; 
   use strict;
   use base ('missing');

   sub new { bless {}, __PACKAGE__);
基本杂注尝试为您加载丢失的包。您不需要单独的“use missing”语句

最后一件事可能是这样的:

   sub new() { return bless {}, __PACKAGE__; }
   package test;
   use strict;
   use warning;
   use base ('missing');

   sub new { bless {}, __PACKAGE__);
   sub DESTROY {}
   sub AUTOLOAD {}
   1;
然后,您可以将这一切打包到一个名为test.pm的文件中,并在脚本中使用它:

   use strict;
   use test;

   my $object = test->new(); # Should fatal, as there is no 'missing' module

希望这能有所帮助。

@missing::ISA和missing::DESTROY是两个可能的候选项。甚至可能&missing::AUTOLOAD…在Perl5.16之前只有三个警告。对于Perl5.18,只有两个警告。
   use strict;
   use test;

   my $object = test->new(); # Should fatal, as there is no 'missing' module