【发布时间】:2011-11-07 00:01:20
【问题描述】:
当你运行perl -e "Bla->new" 时,你会得到这个众所周知的错误:
Can't locate object method "new" via package "Bla"
(perhaps you forgot to load "Bla"?)
由于我的疏忽,前几天发生在 Perl 服务器进程中。有多个脚本,其中大多数都有正确的use 语句。但是有一个脚本在第 123 行的sub blub 中执行Bla->new,但在顶部缺少use Bla,并且当它被点击而没有使用Bla 的任何其他脚本被加载时之前的服务器进程,然后砰!
单独测试脚本是防止这种特殊错误的明显方法,但遗憾的是,代码依赖于庞大的环境。您知道防止这种疏忽的另一种方法吗?
更新
这是一个例子,PPI(尽管有其优点)在其对 Perl 的看法中受到限制:
use strict;
use HTTP::Request::Common;
my $req = GET 'http://www.example.com';
$req->headers->push_header( Bla => time );
my $au=Auweia->new;
__END__
PPI::Token::Symbol '$req'
PPI::Token::Operator '->'
PPI::Token::Word 'headers'
PPI::Token::Operator '->'
PPI::Token::Word 'push_header'
PPI::Token::Symbol '$au'
PPI::Token::Operator '='
PPI::Token::Word 'Auweia'
PPI::Token::Operator '->'
PPI::Token::Word 'new'
设置标题和分配Auweia->new 解析相同。所以我不知道你怎么能建立在这样一个摇摇欲坠的基础上。我认为问题在于Auweia 也可能是一个子程序; perl.exe 直到运行时才知道。
进一步更新
好的,从下面 @Schwern 的指导性 cmets 中我了解到 PPI 只是一个标记器,如果您接受它的限制,您可以在它的基础上进行构建。
【问题讨论】:
-
我想知道 perlcritic 是否有对此有所帮助的政策。
-
@Lumi PPI 标记正确。它并不不稳定,但它只是一个标记器。你必须提供意义。我会更新我的答案来处理这种情况。
标签: perl qa perl-module