WWW :: Scripter作为父类会导致奇怪的错误消息

时间:2014-02-23 18:09:16

标签: javascript perl www-mechanize

当我使用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

1 个答案:

答案 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要糟糕得多。