加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 在Moose中创建一个Web :: Scraper对象作为类属性

发布时间:2020-12-16 06:21:17 所属栏目:大数据 来源:网络整理
导读:我试图模仿 code found here,具体,这个属性: # web-scraper objecthas 'worker' = ( is = 'ro',isa = 'Web::Scraper',default = sub { scraper(sub { }); }); 但是当我在我的类中放入相同的代码时,我收到以下错误: Not a HASH reference at accessor MyMod
我试图模仿 code found here,具体,这个属性:

# web-scraper object
has 'worker' => (
    is      => 'ro',isa     => 'Web::Scraper',default => sub {
        scraper(sub { });
    }
);

但是当我在我的类中放入相同的代码时,我收到以下错误:

Not a HASH reference at accessor MyModule::scraper

这是我的代码:

has 'scraper' => (is => 'rw',isa => 'Web::Scraper',default => sub { scraper( sub { } ); });

以下是穆斯的错误:

# There were 1 warning(s)
#   Previous test 0 ''
#   You are overwriting a locally defined function (scraper) with an accessor at /usr/lib/x86_64-linux-gnu/perl5/5.20/Moose/Meta/Attribute.pm line 1047,<DATA> line 1.
#   Moose::Meta::Attribute::_process_accessors(Moose::Meta::Attribute=HASH(0x3b19838),"accessor","scraper",undef) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Class/MOP/Attribute.pm line 445
#   Class::MOP::Attribute::install_accessors(Moose::Meta::Attribute=HASH(0x3b19838)) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Moose/Meta/Attribute.pm line 994
#   Moose::Meta::Attribute::install_accessors(Moose::Meta::Attribute=HASH(0x3b19838)) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Class/MOP/Class.pm line 897
#   Class::MOP::Class::try {...} () called at /usr/share/perl5/Try/Tiny.pm line 81
#   eval {...} called at /usr/share/perl5/Try/Tiny.pm line 72
#   Try::Tiny::try(CODE(0x3b076f0),Try::Tiny::Catch=REF(0x3b195e0)) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Class/MOP/Class.pm line 902
#   Class::MOP::Class::_post_add_attribute(Moose::Meta::Class=HASH(0x349f920),Moose::Meta::Attribute=HASH(0x3b19838)) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Class/MOP/Mixin/HasAttributes.pm line 38
#   Class::MOP::Mixin::HasAttributes::add_attribute(Moose::Meta::Class=HASH(0x349f920),Moose::Meta::Attribute=HASH(0x3b19838)) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Moose/Meta/Class.pm line 573
#   Moose::Meta::Class::add_attribute(Moose::Meta::Class=HASH(0x349f920),"definition_context",HASH(0x2921ce8),"is","rw","isa","Web::Scraper","default",...) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Moose.pm line 76
#   Moose::has(Moose::Meta::Class=HASH(0x349f920),CODE(0x3ae1a60)) called at /usr/lib/x86_64-linux-gnu/perl5/5.20/Moose/Exporter.pm line 408
#   Moose::has("scraper",CODE(0x3ae1a60)) called at /home/steve/perl/perl-lib/LaborData/DataFetcher.pm line 33
#   require LaborData/DataFetcher.pm called at ./labor_data.t line 27
#   main::BEGIN() called at /home/steve/perl/perl-lib/LaborData/DataFetcher.pm line 0
#   eval {...} called at /home/steve/perl/perl-lib/LaborData/DataFetcher.pm line 0
#  at /usr/lib/x86_64-linux-gnu/perl5/5.20/Moose/Meta/Attribute.pm line 1047,CODE(0x3ae1a60)) called at /home/steve/perl/perl-lib/LaborData/DataFetcher.pm line 33
#   require LaborData/DataFetcher.pm called at ./labor_data.t line 27
#   main::BEGIN() called at /home/steve/perl/perl-lib/LaborData/DataFetcher.pm line 0
#   eval {...} called at /home/steve/perl/perl-lib/LaborData/DataFetcher.pm line 0
#

解决方法

您正在遭受从Web :: Scraper导入的scraper函数与has’surbper’=>定义的scraper访问器方法之间的名称冲突. ….这就是你用覆盖码覆盖本地定义的函数(scraper)的警告.

代码当前编写的方式,默认的初始化程序刮刀(sub {});最终直接调用accessor方法,它会立即死掉,因为它期望一个对象作为它的第一个参数,而不是sub {}.

解决此问题的最简单方法是重命名属性.不幸的是,其他方法更难,因为Web :: Scraper不支持重命名或抑制其导出的符号.

以下代码未经测试,但如果您希望保持属性名称相同,则可能会有效:

use Moose;
use Web::Scraper;
BEGIN { *_web_scraper = &;scraper; undef &scraper; }

has 'scraper' => (
    is      => 'ro',default => sub {
        _web_scraper(sub { });
    },);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读