2011-06-21 68 views
5

我有屬性::處理程序一個奇怪的問題,看起來像某種錯誤的:爲什麼不從其他包中調用Perl屬性處理程序?

package MyPackage; 

use Attribute::Handlers; 

sub UNIVERSAL::foo :ATTR(CODE) { 
    ... 
} 

當MyPackage的使用,或從使用MyPackage的腳本的主包,foo的處理函數被調用每當編譯器遇到的形式

sub bar:foo { 
... 
} 

的功能不過,我還有一個包,在一個單獨的.pm文件,使用MyPackage的。編譯器接受「:foo」屬性,但處理程序是而不是調用。

我試圖在MyPackage中編寫一個導入函數,它將foo處理程序導出到調用者的名稱空間,但這似乎沒有幫助。

任何人都可以理解這一點嗎?過去幾天,我一直在關注如何解決這個問題。

+0

你是否在使用'strict'和'warnings'? –

+0

@Chris - 是的。我開始懷疑我正在使用的其他軟件包之一與Attribute:Handlers衝突。 – Rob

+0

你可以在這裏添加更多代碼嗎?一些你正在做什麼以及它不工作的全功能例子? –

回答

0

我在某些方面完全錯過了昨天發佈的屬性::處理程序 - 正如我對此答案較早版本的評論中所述,可能將use MyPackage包裝在BEGIN塊中會導致問題得到正確解決。

我不確定您爲什麼選擇將foo()屬性處理程序置於UNIVERSAL--是朝着嘗試使其運行的一步嗎?

+0

你讀過我的帖子了嗎?我正在使用屬性::處理程序。 – Rob

+0

我做了,錯過了。據我可以從你的帖子和文件中知道你做得對。答案更新了一些猜測要嘗試的東西。 –

+0

Joe,我把它放在UNIVERSAL中,以便其他模塊可以使用這些屬性。這就是Attribute :: Handlers推薦的。 – Rob

3

默認情況下,屬性處理程序在編譯階段後的CHECK塊中被調用。

如果「使用」包使用eval "use packagename";那麼只會執行BEGIN塊。 CHECK塊不會被執行,屬性處理程序也不會被調用。

嘗試使用ATTR(CODE,BEGIN)來執行BEGIN塊中的處理程序。

相關問題