このアーカイブは同期化されません。 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 関数に渡されていることが分かる。