PerlIO::Util

PerlIOアーキテクチャを使ったアイデアをいくつか思いついたので具現化してみた。
http://search.cpan.org/dist/PerlIO-Util/

use PerlIO::Util; # push_layer()のため
*STDERR->push_layer(tee => '>>foo.log');
*STDERR->push_layer(tee => \$logs);

とか

# use PerlIO::Util;は不要
open my $io, '+<:creat :flock', $file;

とか

open my $in, '<:dir', '.';
print while <$in>;

などなど,いろいろできる。

他,逆読みするPerlIO::reverseや,ファイルシステムエンコーディングを適当に処理してくれるPerlIO::fseなどを考えている。

しかし,PerlIOの実装自体かなり不完全というか未熟な気がする。truncate()やflock()を実装できないし,tieやoverloadと違ってreadline()をオーバーロードできないから,上記PerlIO::dirの実装はかなり変なことになっている。読み出すファイル名の末尾に改行がついているのはそのためだ。

PerlIOの仕組みが複雑すぎて,ユーザーレイヤの実装の敷居が高すぎるのも一つの原因ではあるかもしれない。確かに,perldoc perliolを読んでもどこで手をつけたらいいのか分からず,PerlIO::Utilの実装でも,結局ソースコード(perlio.c)を読まなければならなかった。