perl – 当在另一个包中调用它们时,如何最好地覆盖/包装像sysread这样的核心函数

我正在研究用Perl编写的相当复杂的应用程序.我对这门语言很有经验,但我对此很难过.

我正在使用一个模块Foo,它使用sysread和syswrite对文件句柄(在这种情况下为双向套接字)进行各种操作,然后传递给它的构造函数.

我想执行以下操作:从我正在编写的另一个模块(让我们称之为Bar),我想改变sysread / write的行为方式,只有在属于Foo的方法中调用时才会这样做

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

我想这样做的原因是我需要跟踪从上述文件句柄读取/写入的字节数.在这一点上,这似乎是我获取此信息的唯一方法 – 基本上保存了sysread / write的返回值.

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

更新:我找到了一个更好的解决方案来解决我的具体问题,并在此处发布了代码:

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

它似乎在我的应用程序中运行得很好,但是在我对它进行更全面的测试之前我不会将它发布到CPAN,还要写一些实际的单元测试:)

最佳答案 您可以通过创建自己的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;
};
点赞