我试图在不修改源代码的情况下解决有缺陷的包:
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
?
编辑:我的错误报告在几个小时内修复了这个特定错误!但无论如何知道如何对包进行别名都很有用。虽然我通过子类化解决了我的问题,但正如接受的答案建议的那样,我已经添加了一个自我答案,显示了如何使用别名来完成。
答案 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::createSeq
和Treex::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::;