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

如何在Perl中找到从包中继承的所有包?,第1张

概述我有许多不同的网站,我从中下载数据并按摩到其他格式(使用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/perluse 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/perluse 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 /

总结

以上是内存溢出为你收集整理的如何在Perl中找到从包中继承的所有包?全部内容,希望文章能够帮你解决如何在Perl中找到从包中继承的所有包?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1266528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存