加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 当在另一个包中调用它们时,如何最好地覆盖/包装像sysrea

发布时间:2020-12-16 06:14:23 所属栏目:大数据 来源:网络整理
导读:我正在研究用Perl编写的相当复杂的应用程序.我对这门语言很有经验,但我对此很难过. 我正在使用一个模块Foo,它使用sysread和syswrite对文件句柄(在这种情况下为双向套接字)进行各种操作,然后传递给它的构造函数. 我想执行以下操作:从我正在编写的另一个模块(
我正在研究用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;
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读