Perlで学ぶ「詳解 UNIXプログラミング」(その5) 第5章 標準入出力ライブラリ
はじめに
「詳解 UNIXプログラミング」の第五章を示します。
5.1 getc()とputc()を用いて標準出力へコピーする
1章あたりでも書いた気がするけど。
Perlでは putcがありませんので、printを使ってください。
#!/usr/bin/env perl use strict; use warnings; # getc()とputc()を用いて標準出力へコピーする while (1) { my $c = getc(STDIN); last unless defined $c; print STDOUT $c; }
5.2 fgets()とfputs()を用いて標準出力へコピーする
fgetsはないので、IO::Handle::gets、
いずれかを使います。fputsは printを使います。
#!/usr/bin/env perl use strict; use warnings; use IO::Handle; # fgets()とfputs()を用いて標準出力へコピーする my $io = IO::Handle->new; unless ($io->fdopen(fileno(STDIN), "r")) { die "Can't open STDIN\n"; } while (my $line = $io->gets) { print STDOUT "$line"; }
5.3 さまざまな標準入出力ストリームのバッファリング方式を表示する
setvbufを使っていろいろやるというお話なのですが、普通に Perlをビルド
しただけでは使えないようです。-Dd_setvbufを付けてビルドしたんですが、
それでも使えませんでした。
すぐに出力したい場合は $|を真にするか、autoflush関数を使えばよいでしょう。
#!/usr/bin/env perl use strict; use warnings; use FileHandle; # さまざまな標準入出力ストリームのバッファリング方式を表示する { local $| = 1; print STDOUT "Not buffering with \$|\n" } STDOUT->autoflush(1); print STDOUT "Not buffering with autoflush\n"; __END__ # デフォルトのビルドオプションでは setvbufは無効 my $fh = FileHandle->new("test", "w"); die "Can't open file\n" unless defined $fh; $fh->setvbuf(my $buf, _IOLBF, 1024); $fh->print("AAA\nBBB\nCCC\n");
5.4 tmpnamとtmpfileの使い方
POSIX::tempfileはエラーが出て使えません。
普段使うときは File::Tempモジュールの関数を利用しましょう。
#!/usr/bin/env perl use strict; use warnings; use POSIX; use File::Temp; # tmpnamとtmpfileの使い方 print POSIX::tmpnam(), "\n"; # first temp name print POSIX::tmpnam(), "\n"; # second temp name #my $fp = POSIX::tmpfile(); Can't use POSIX::tmpfile() my $fp = File::Temp::tempfile(); # or IO::File::new_tempfile() print $fp "one line of output\n"; seek $fp, 0, SEEK_SET or die "Can't seek file $!\n"; print <$fp>;