而重构我的一些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
希望这可以帮助.