如何在Perl中找到从包中继承的所有包?
我有许多不同的网站,我从中下载数据并按摩到其他格式(使用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 解决方法
使用
Moose 的
Class::MOP 基础,您可以找到分配给每个类的子类(在该时间点).
从
例如,如果我们构建这些类: { 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 / (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |