4

私はPerlで書かれたかなり複雑なアプリケーションに取り組んでいます。私はその言語にかなりの経験がありますが、私はこれに困惑しています。

コンストラクターに渡すファイルハンドル(この場合は双方向ソケット)のさまざまな操作にsysreadとsyswriteを使用するモジュールFooを使用しています。

次のことを行いたい:私が書いている別のモジュール(これをBarと呼びましょう)から、Fooに属するメソッド内から呼び出された場合にのみsysread/writeが動作する方法を変更したい

Sysread et alは、他のすべての場所で通常どおりに機能する必要があります。Fooではsysreadの使用は変わらないと安全に想定できます。

これを実行したい理由は、前述のファイルハンドルからの読み取り/書き込みのバイト数を追跡​​する必要があるためです。この時点で、これは私がこの情報を取得できる唯一の方法のようです-基本的にsysread/writeからの戻り値を保存します。

品質が良ければ、CPANの何でも問題なく使用できます。


更新:特定の問題に対するより良い解決策を見つけ、ここにコードを投稿しました:

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

私のアプリケーションでは非常にうまく機能しているようですが、より徹底的にテストし、実際の単体テストをいくつか作成するまで、CPANに投稿しません:)

4

1 に答える 1

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;
};
于 2011-05-19T23:23:15.810 に答える