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

如何在Perl中找到从包中继承的所有包?

发布时间:2020-12-15 23:26:16 所属栏目:大数据 来源:网络整理
导读:我有许多不同的网站,我从中下载数据并按摩到其他格式(使用Perl)在工作中使用,这些都是从一个Perl脚本运行的,如下所示: #! /usr/bin/perluse strict;use My::Package1;use My::Package2;my $p1 = My::Package1-new;$p1-download;my $p2 = My::Package2-new;$
我有许多不同的网站,我从中下载数据并按摩到其他格式(使用Perl)在工作中使用,这些都是从一个Perl脚本运行的,如下所示:

#! /usr/bin/perl
use strict;

use My::Package1;
use My::Package2;

my $p1 = My::Package1->new;
$p1->download;

my $p2 = My::Package2->new;
$p2->download;

等等等等.目前每个My :: Package都是自己的包;它不会从基础包或任何东西继承.我打算用Moose重新编写它们,我希望每次添加新包时都不必编辑运行下载的Perl脚本,可能有办法找到从基础包继承的包,然后在循环实例化每个并进行下载,有点像:

#! /usr/bin/perl
use strict;

for my $pname (packages_that_inherit_from("My::Package")) {
    my $package = $pname->new;
    $package->download;
}

它可能是什么,或者是什么?

TIA

解决方法

使用 MooseClass::MOP基础,您可以找到分配给每个类的子类(在该时间点).

Class::MOP::Class文档:

$metaclass->subclasses
This returns a list of all subclasses for this class,even indirect subclasses.

$metaclass->direct_subclasses
This returns a list of immediate subclasses for this class,which does not include indirect subclasses.

例如,如果我们构建这些类:

{
    package Root;
    use Moose;
    use namespace::clean -except => 'meta';

    sub baz      { say 'Some root thingy' }
    sub download { say "downloading from " . __PACKAGE__ }
}

{
    package NodeA;
    use Moose;
    extends 'Root';
    use namespace::clean -except => 'meta';
    sub download { say "downloading from " . __PACKAGE__ }
}

{
    package NodeA1;
    use Moose;
    extends 'NodeA';
    use namespace::clean -except => 'meta';
    sub download { say "downloading from " . __PACKAGE__ }
}

然后以您的示例为基础,我们可以这样做:

for my $pname ( Root->new->meta->direct_subclasses ) {
    my $package = $pname->new;
    $package->download;
}

# =>  "downloading from NodeA"

所以上面运行NodeA->下载.将上面的内容更改为meta->子类也将运行NodeA1->下载.

/ I3az /

(编辑:李大同)

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

    推荐文章
      热点阅读