2006 年 3 月 13 日 23 時 58 分

tie の実験


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今日は実験をしてみよう。

ファイルハンドルの tie には、
Tie::Handle という既定の実装が存在する。

この実装は、PRINT, PRINTF, GETC の呼び出しを、
WRITE と READ 用に変換して代わりに呼び出してくれるのだ。
つまり、全てのメソッドを準備する必要がなくなるので、
独自のクラスを作るためには、これを継承すると楽だ。

# 独自クラス。
package NaggingHandle;

# Tie::Handle を継承。
use Tie::Handle;
our @ISA = ('Tie::Handle');

# tie 関数に対応してオブジェクトを作成する。
sub TIEHANDLE {
    my $package = shift;
    my $handle  = shift;
    bless(\$handle, $package);
}

# syswrite, print, printf などのハンドラ。
sub WRITE {
    my ($this, $scalar, $length, $offset) = @_;
    $offset = 0 unless defined $offset;
    print $this "# write $length bytes\n";
    print $this substr($scalar, $offset, $length);
}

# メインのパッケージに戻る。
package main;

# tie を呼び出して、OUT に割り付ける。
tie *OUT, 'NaggingHandle', *STDOUT;

# print, printf などのために選択しておく。
select(OUT);

print 'Print', 'Some', 'String', "\n";
printf "%s=%d\n", 'Value', 1234;
syswrite OUT, 'syswrite!', 9;


実行した出力は以下の通りとなった。

# write 16 bytes
PrintSomeString
# write 11 bytes
Value=1234
# write 9 bytes
syswrite!


どうだろう。syswrite 含め、
書き込み系関数の呼び出しが、
WRITE 関数に渡されていることが分かる。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.