gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:25:52 25 4
gpt4 key购买 nike

我有许多不同的站点,我从中下载数据并将其转换为其他格式(使用 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 基础,您可以找到分配给每个类的子类(在那个时间点)。

来自 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->download 。将上面更改为 meta->subclasses 也会运行 NodeA1->download

/I3az/

关于perl - 如何在 Perl 中找到从包继承的所有包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2025261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com