gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:11:20 24 4
gpt4 key购买 nike

我正在开发一个用 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;
};

关于perl - 当它们在另一个包中被调用时,如何最好地覆盖/包装像 sysread 这样的核心函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6065872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com