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

而重构我的一些perl代码
注意到以下扼杀行为.
考虑这个小样本脚本:
#!/usr/bin/perl -w

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

exit(0)

预期的警告

Can't locate package missing for @test::ISA at test.pl line 8

出现三次而不是一次.此警告的另外两个触发器是什么?所有三个都指出口(0).
gentoo linux上的perl-version 5.12.4.

谢谢.

解决方法

我相信tjd得到了答案.如果您将DESTROY()和AUTOLOAD()方法添加到测试包中,您将只收到一个警告(关于缺少@test :: ISA).
package test;
   use strict;

   sub DESTROY {}
   sub AUTOLOAD {}

您通常需要确保已加载@ISA列表中列出的包.在您的示例中,您可能希望看到类似的内容

package test;  
   use strict;
   use missing;

   our @ISA = ('missing');

有点好奇你的包没有显式的new()方法.相反,你有一个调用bless()的语句;

如果你有一个new()方法,像这样:

sub new() { return bless {},__PACKAGE__; }

然后在看到new()之前你不会看到三重错误消息;

package main;
   my $object = test->new(); # Triple warning

你可能想要使用pragma’base’,它会给你一个致命的错误,说它无法加载’missing’包:

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

   sub new { 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

希望这可以帮助.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...