2015-11-03 127 views
1

我試圖解決一個有錯誤的包中添加軟件包別名,而無需修改源:如何通過猴子修補

  • Treex::PML::Schema::Container.pm長的子程序,包含兩個不存在的包Treex::PML::FSFactory。它應該是Treex::PML::Factory
  • 有問題的子程序太長以至於無法從另一個文件複製和修補,所以我想猴子補丁Treex::PML,以便它提供Treex::PML::FSFactory作爲Treex::PML::Factory的別名。

在我的主程序我嘗試以下(基於this recipe),但它似乎沒有任何效果:

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

package MyPackage; 
... 

我怎樣才能得到Treex::PML::FSFactory春天開始存在,在這樣的一種可以被Treex::PML::Schema::Container看到的方式?

編輯:這個特殊的錯誤在我的錯誤報告的幾個小時內得到修復!但是,無論如何知道如何使用別名都很有用。儘管我通過子類化解決了我的問題,但正如接受的答案所建議的那樣,我已經添加了一個自我回答,顯示如何使用別名完成它。

+1

你爲什麼不提交錯誤報告?我懷疑作者是社區活躍成員@choroba。 – ikegami

+0

我也會這樣做,謝謝。 CTAN告訴我,作者是Petr Pajas,他最近與我聯繫了相關的isssues(我正在摔跤的應用程序) - 沒有迴應。但我現在看到,谷歌已經把我送到PML的舊版本。 @choroba已經接管了。 – alexis

+0

如果您在*使用Treex :: PML之前執行此操作,您的初始嘗試是否有效? – ysth

回答

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心靈通過一個子類被稱爲,他們不知道;他們完全無視他們的主張。

+0

謝謝,好主意,但它沒有奏效。任何想法爲什麼?我猜''FSFactory'的定義在Container :: validate_object()裏面是不可見的,但我對perl命名空間的語義一無所知 - 我可能是錯的。我不知道它是否相關,但是我在代碼中使用了「使用Treex :: PML;」的單獨實例(在別處需要)。 – alexis

+0

軟件包全球存在。這不是一個可見性問題。這可能是一個計時問題。你可能已經做得太晚了。你甚至可能需要一個'BEGIN'。通過在'@ ISA'的任務旁邊添加一個'print'可以方便地進行檢查。 – ikegami

+0

你能否解釋一下我必須注意什麼才能獲得正確的時機?該代碼與調用Container中的越野車功能的子例程位於相同的文件中(以及上方)。 – alexis

1

@ ikegami的建議,派生類而不是別名,工作得很好。但是,這裏也是如何將一個包名稱別名到另一個,如問題所示:

a。用Package::Alias

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

b。爲避免從cpan下載Package::Alias,我遵循this recipe,它顯示了Package::Alias實際上是如何實現的。它的工作原理:-)

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