次の最小限の例では、ラッパーを定義していますPerlIO_write
。
MODULE = My::FH PACKAGE = My::FH
INCLUDE: const-xs.inc
int
write_fh (SV* fh, SV* str)
CODE:
STRLEN len
char* buf = SvPV(str, len);
PerlIO* io = IoIFP(sv_2io(fh));
if (io) {
RETVAL = PerlIO_write(io, buf, len);
} else {
croak("cannot use fh as a PerlIO handle");
}
OUTPUT:
RETVAL
を使用しwrite_fh
て作成されたファイルハンドルで関数を使用open $fh, '<', \$buf
すると、期待どおりに機能します。ただし、次のスニペットを使用して作成された結ばれたファイルハンドルは、PerlIO ハンドルに変換されません:
my $fh = Symbol::gensym;
tie *$fh, 'My::TIEFH', \$buf;
My::TIEFH
必要なメソッドが含まれており、それへの書き込みはprint
$fh $str
期待どおりに機能します。
XS ランドから結ばれたファイルハンドルに書き込むにはどうすればよいですか?