如何通过猴子修补添加包别名

时间:2015-11-03 19:39:17

标签: perl perl-module

我试图在不修改源代码的情况下解决有缺陷的包:

  • Treex::PML::Schema::Container.pm中的长子例程包含对不存在的包Treex::PML::FSFactory的两个引用。它应该是Treex::PML::Factory
  • 违规子程序太长,无法从其他文件复制和修补猴子,所以我想修补Treex::PML,以便Treex::PML::FSFactory作为{{{1}的别名1}}。

在我的主程序中,我尝试了以下内容(基于this recipe),但它似乎没有任何效果:

Treex::PML::Factory

如何让use Treex::PML; package Treex::PML; use Package::Alias FSFactory => 'Treex::PML::Factory'; package MyPackage; ... Treex::PML::FSFactory可见的方式生成Treex::PML::Schema::Container

编辑:我的错误报告在几个小时内修复了这个特定错误!但无论如何知道如何对包进行别名都很有用。虽然我通过子类化解决了我的问题,但正如接受的答案建议的那样,我已经添加了一个自我答案,显示了如何使用别名来完成。

2 个答案:

答案 0 :(得分:3)

鉴于有问题的参考文献,

$content = Treex::PML::FSFactory->createSeq(...)
$content = Treex::PML::FSFactory->createList(...)

添加以下内容应该足够了:

{
   package Treex::PML::FSFactory;
   our @ISA = qw( Treex::PML::Factory );
}

我检查了Treex::PML::Factory::createSeqTreex::PML::Factory::createList是否通过子类调用,而他们没有;他们完全无视他们的请求。

答案 1 :(得分:1)

@ ikegami的建议,派生一个班而不是走样,效果很好。但是这里也是如何将一个包名称别名别名,如问题所示:

一个。使用Package::Alias

use Package::Alias 'Treex::PML::FSFactory' => 'Treex::PML::Factory';

湾为了避免从cpan下载Package::Alias,我跟踪了this recipe,其中显示Package::Alias实际上是如何做到的。它起作用了: - )

*Treex::PML::FSFactory:: = \*Treex::PML::Factory::;