当我使用WWW::Scripter
时,一切正常:
use WWW::Scripter;
my $m = WWW::Scripter->new();
$m->use_plugin('JavaScript');
$m->get('http://some-site-with-java-script.com');
但是当我尝试像这样继承WWW::Scripter
时:
package MyScripter;
use parent qw(WWW::Scripter);
sub new {
my ($class, @args) = @_;
my $self = $class->SUPER::new(@args);
return $self;
}
package main;
my $m = MyScripter->new();
$m->use_plugin('JavaScript');
$m->get('http://some-site-with-java-script.com');
我收到这条奇怪的错误消息:
Error: Can't locate object method "prop" via package "MyScripter" at /home/myuser/localperl/lib/site_perl/5.18.2/JE/LValue.pm line 91
发生了什么事?
WWW::Scripter::VERSION => 0.030
JE::VERSION => 0.060
答案 0 :(得分:3)
我猜测问题取决于所访问的网站,因为我尝试使用http://www.bbc.co.uk/
而没有任何问题(除了它不喜欢XHTML CDATA
部分中的JavaScript apearing )。
这是因为继承层次结构破坏了。我没有找到确切的问题,但我认为这是因为JavaScript
插件的工作方式。它希望在WWW::Scripter
对象的上下文中被调用(坚持存在)并具有明确的
use WWW::Scripter 0.022
一开始,它将从基本模块加载所有方法定义,而不是从子类加载。
那里有各种令人讨厌的东西,例如使用Perl 4包名称分隔符,如use LWP'UserAgent
,以及文字路径加载,如
require "WWW/Scripter/Plugin/JavaScript/" . "$$self[benm].pm"
这几乎不可能是更多的反继承。
如果没有更多工作,很难判断它是一个简单的修复还是重写,但为了解决您的问题,我建议使用角色而不是继承,这样可以让角色模型更加自由。它如何做到这一点。它在perldoc perlootut中得到了很好的描述,而且你比试验Role::Tiny
要糟糕得多。