重构我的一些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
出现三次而不是一次。此警告的另外两个触发器是什么?这三个都是exit(0)
gentoo linux上的perl-version 5.12.4。
感谢。
答案 0 :(得分:1)
我相信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
希望这有帮助。