【发布时间】:2013-01-02 08:38:28
【问题描述】:
我有一个Perl Subversion pre-commit hook。有人使用 Perl 5.14 时弹出一条神秘的错误消息,这在早期版本的 Perl 中是没有的:
(in cleanup) Non existant subroutine called Section::File::DESTROY at /home/tftung/svn_repos/hooks/pre-commit-kitchen-sink-hook.pl line 282
让我印象深刻的第一件事是 nonexistent 的拼写错误。小子,那家伙根本不会拼音!这几乎和……我的拼写一样糟糕……等一下……
在我的代码的第 1251 行,这是来自我的 AUTOLOAD 子例程:
croak qq(Non existant subroutine called $AUTOLOAD);
是的,这是错误行。
这在 Perl 5.12 中没有发生,这是我在 Mac 上使用的,并且在我的 PC 上具有草莓和 ActiveState 两种风格。从 Perl 5.8 到 5.10 的企业 Linux 机器也不会发生这种情况。
看起来 Perl 正在调用 DESTROY,而这已被我的 AUTOLOAD 子例程接收,并且由于 DESTROY 在我的包中是 不存在 子例程,因此 AUTOLOAD子例程显示此错误消息。
- 这是新版本 Perl 中的错误还是功能? AUTOLOAD 接听对 DESTROY 的调用似乎是相当新的功能。
- 我应该如何解决这个问题?我的意思是除了摆脱我的 AUTOLOAD 子程序,这可能是正确的答案。我计划从头开始完全重写这个脚本,所以我宁愿不做很多工作。
- 我可以编写一个不执行任何操作的
DESTROY子例程。 - 我可以让我的
AUTOLOAD例程忽略对DESTROY的调用。
- 我可以编写一个不执行任何操作的
最好的处理方法是什么?
【问题讨论】: