読者です 読者をやめる 読者になる 読者になる

Perlで学ぶ「詳解 UNIXプログラミング」(その5) 第5章 標準入出力ライブラリ

perl APUE unix

はじめに

「詳解 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、readline関数の
いずれかを使います。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>;

まとめ

「詳解 UNIXプログラミング」の第五章を示しました。


この章に出てくる内容は Perlだと無効化されているものがいくつかありましたね。
低レベルなものは何かと危険をはらんでいたりもするので、もっと安全で使いやすい
ものが提供されているのであればそちらを確実に使うべきでしょうね。