在重构我的一些perl代码时,我注意到以下的strang行为.
考虑这个小样本脚本:
#!/usr/bin/perl -w
package test;
use strict;
my $obj = bless( {}, __PACKAGE__);
our @ISA = qw( missing );
exit(0)
Run Code Online (Sandbox Code Playgroud)
在预期的警告
Can't locate package missing for @test::ISA at test.pl line 8
Run Code Online (Sandbox Code Playgroud)
出现三次而不是一次.此警告的另外两个触发器是什么?这三个都是指exit(0).
gentoo linux上的perl-version 5.12.4.
谢谢.
相信tjd已经找到答案了。如果您将 DESTROY() 和 AUTOLOAD() 方法添加到测试包,您只会收到一个警告(关于缺少 @test::ISA)。
package test;
use strict;
sub DESTROY {}
sub AUTOLOAD {}
Run Code Online (Sandbox Code Playgroud)
您通常需要确保 @ISA 列表中列出的包已被加载。在您的示例中,您可能期望看到类似以下内容:
package test;
use strict;
use missing;
our @ISA = ('missing');
Run Code Online (Sandbox Code Playgroud)
有点奇怪的是你的包没有显式的 new() 方法。相反,您有一个调用 bless(); 的语句。
如果您有一个 new() 方法,如下所示:
sub new() { return bless {}, __PACKAGE__; }
Run Code Online (Sandbox Code Playgroud)
然后你不会看到三重错误消息,直到调用 new(); 的东西。
package main;
my $object = test->new(); # Triple warning
Run Code Online (Sandbox Code Playgroud)
您可能想使用 pragma 'base',这会给您一个致命错误,指出它无法加载“missing”包:
package test;
use strict;
use base ('missing');
sub new { bless {}, __PACKAGE__);
Run Code Online (Sandbox Code Playgroud)
基本编译指示尝试为您加载缺少的包。您不需要单独的“使用缺失”声明。
所以最后的事情可能看起来像这样:
package test;
use strict;
use warning;
use base ('missing');
sub new { bless {}, __PACKAGE__);
sub DESTROY {}
sub AUTOLOAD {}
1;
Run Code Online (Sandbox Code Playgroud)
然后,您可以将所有内容包装到名为 test.pm 的文件中,并在脚本中使用它:
use strict;
use test;
my $object = test->new(); # Should fatal, as there is no 'missing' module
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。