gpt4 book ai didi

perl - 为非对象 perl 模块复制 base/parent.pm 功能的最简洁方法是什么?

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

我现在想得不太清楚,可能忽略了一些简单的事情。我已经思考这个问题有一段时间并一直在搜索,但无法再真正想到任何合理的搜索查询来引导我找到我想要的东西。

简而言之,我想知道如何进行模块继承,就像 base.pm/parent.pm 为面向对象模块所做的那样;仅适用于基于导出器的模块。

我的意思的假设例子:

这是我们的脚本。它最初加载 Foo.pm 并从中调用 baz(),但 baz() 有一个可怕的错误(我们很快就会看到),所以我们现在使用 Local/Patched/Foo.pm 应该可以修复该错误。我们这样做是因为在这个假设的情况下,我们无法更改 Foo(你看,它是一个正在积极开发的 cpan 模块),而且它很大(认真的)。

#!/usr/bin/perl

# use Foo qw( baz [... 100 more functions here ...] );
use Local::Patched::Foo qw( baz [... 100 more functions here ...] );
baz();

这里是 Foo.pm。正如你所看到的,它导出 baz(),它调用 qux,它有一个可怕的错误,导致崩溃。不过,我们希望保留 baz 和 Foo.pm 的其余部分,而不需要进行大量的复制粘贴,特别是因为 Foo 仍在开发中,它们以后可能会发生变化。

package Foo;
use parent 'Exporter';
our @EXPORT = qw( baz [... 100 more functions here ...] );
sub baz { qux(); }
sub qux { print 1/0; } # !!!!!!!!!!!!!
[... 100 more functions here ...]
1;

最后,由于 Foo.pm 在许多地方使用,我们不想使用 Sub::Exporter,因为这意味着将创可贴修复复制粘贴到所有这些地方。相反,我们正在尝试创建一个行为和外观类似于 Foo.pm 的新模块,并且实际上仍然从 Foo.pm 加载其 99% 的功能,并且只是用更好的模块替换了丑陋的 qux sub。

如果 Foo.pm 是面向对象的,那么这样的事情会是什么样子:

package Local::Patched::Foo;
use parent 'Foo';
sub qux { print 2; }
1;

现在这显然在我们当前的情况下不起作用,因为parent.pm 不会做这种事情。

是否有一种干净、简单的方法可以以可行的方式编写 Local/Patched/Foo.pm(使用任何适用的 CPAN 模块),而不需要手动复制 Foo.pm 的函数命名空间?

最佳答案

如果您想要覆盖其中一个子例程,您可以进行一些猴子修补:

*Foo::qux =\&fixed_qux;

我不确定这是否是最干净或最好的解决方案,但在上游修复 qux 中的错误之前作为临时权宜之计,它应该可以。

关于perl - 为非对象 perl 模块复制 base/parent.pm 功能的最简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3462248/

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