Как лучше переопределить / обернуть основные функции, такие как sysread, когда они вызываются в другом пакете

Я работаю над довольно сложным приложением, написанным на Perl. Я довольно опытный с языком, но я просто озадачен этим.

Я использую модуль Foo, который использует sysread и syswrite для различных операций над дескриптором файла (в данном случае это двунаправленный сокет), который я передаю его конструктору.

Я хочу сделать следующее: из другого модуля, который я пишу (давайте назовем его Bar), я хочу изменить способ поведения sysread/write только при вызове изнутри методов, принадлежащих Foo

Sysread и др. Должны работать как обычно везде. Можно смело предположить, что использование sysread не изменится в Foo.

Причина, по которой я хочу это сделать, заключается в том, что мне нужно отслеживать количество байтов, считываемых / записываемых в вышеупомянутый дескриптор файла. На данный момент кажется, что это единственный способ получить эту информацию - в основном сохранение возвращаемого значения из sysread/write.

У меня нет проблем с использованием чего-либо из CPAN, если оно хорошего качества.


Обновление: я нашел лучшее решение для моей конкретной проблемы и разместил код здесь:

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

Похоже, что он очень хорошо работает в моем приложении, но я не буду публиковать его в CPAN, пока не провожу более тщательное тестирование, плюс не написал несколько реальных модульных тестов:)

1 ответ

Вы можете сделать это, создав собственную функцию 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;
};
Другие вопросы по тегам