2011-06-21 23 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块中的处理程序。

相关问题