2011-05-19 22 views
4

我正在研究一个用Perl编写的相当复杂的应用程序。我对这门语言有相当的经验,但是我很困难。当在另一个包中调用核心函数时如何最好地覆盖/包装核心函数

我正在使用一个模块Foo,它将sysread和syswrite用于文件句柄(本例中为双向套接字)上的各种操作,并传递给它的构造函数。

我要做到以下几点:从另一个模块,我写,(让我们称之为吧),我想改变这种状况sysread执行/的方式写行为从属于方法中调用的Foo只有当

Sysread等人需要像其他地方一样正常工作。可以安全地假定在Foo中sysread的使用不会改变。

原因我想做到这一点的是,我需要跟踪被读取/写入前面提到的文件句柄的字节数。在这一点上,这似乎是我可以得到这些信息的唯一方式 - 基本上可以从sysread/write保存返回值。

使用CPAN中的任何东西都没有问题,只要质量好。


更新:我发现了一个更好的解决方案,以我的具体问题,并张贴在这里的代码:

https://github.com/Hercynium/Tie-Handle-CountChars

似乎在我的应用程序中工作得很好,但我赢了”不要张贴它到CPAN,直到我已经更彻底地测试它,再加上写下一些实际的单元测试:)

+1

它发生,我认为我可能能够通过捆绑文件句柄变量来实现我的目标。我从来没有做过 - 提示欢迎 - 但我会发布,如果我想出有用的东西。 – Hercynium 2011-05-20 00:16:47

+0

在这里工作的可能的解决方案:https://github.com/Hercynium/Tie-Handle-CountChars 它仍然有一个错误,即捆绑的文件句柄不能正确关闭时,它是一个socket在anyevent下。 – Hercynium 2011-05-24 01:20:26

回答

2

你可以通过创建你自己的Foo :: sysread函数来完成这个工作,它通过记录返回值。该包装可自动完成(防止你不必招惹符号表自己)与Class::Method::Modifiers

package Foo; 

use strict; 
use warnings; 

# ... other code... 

use Class::Method::Modifiers; 
around sysread => sub { 
    my $orig = shift; 

    my $return = CORE::sysread(@_); 

    # do something with $return 

    return $return; 
}; 
+0

我会试试这个 - 我已经用Hook :: LexWrap和符号表中的符号:) – Hercynium 2011-05-20 00:14:47