5. 入出力

初めてのPerl 第6版メモ。

5.1 標準入力からの入力

chomp($line = <STDIN>);
  • 行入力演算子をwhileループの条件分に使用した場合、読み込んだ行は$_に代入される。forループ条件分でも同様。
while (<STDIN>) {
    print  "I saw $_";
}
  • foreachループを使っても同じようなことができるが、foreachではリストコンテキストで行入力演算子が評価されるため、ループ実行前に入力をすべて読み込むという違いがある。
foreach (<STDIN) {
    print "I saw $_";
}

5.2 ダイアモンド演算子からの入力

  • ダイアモンド演算子<>は行入力演算子の一種で、入力をユーザーが指定した場所(起動引数で指定する)から読み込む。

5.3 起動引数

  • ダイアモンド演算子は起動引数そのものではなく、配列@ARGVの内容を見る。
  • @ARGVには起動引数のリストがセットされる。プログラム内部で変更してもかまわない。
  • ダイアモンド演算子は、起動引数が空のとき標準入力ストリームを利用し、そうでなければ@ARGVに入っているファイル名リストを用いる。

5.4 標準出力への出力

  • print演算子は値のリストを受け取り、要素を標準出力に順番に送る。

5.5 printfによるフォーマット付き出力

  • Cのprintf関数のようなフォーマット出力ができる。
    • %g...General numeric conversion. 整数、浮動小数点数、指数形式を状況に応じて適当に選んで出力
    • %d...整数。フィールド幅指定で負の数を指定すると左寄せ(他の変換も)。
    • %s...文字列
    • %f...浮動小数点数
    • %%...%文字そのもの
  • printf演算子は文字列および表示すべき値のリストを受け取る。

5.6 ファイルハンドル

  • ファイルハンドル:Perlプロセスと外部の間のI/Oコネクションに対して付けられた名前。
  • Perl自身が使用するファイルハンドルとしてSTDIN, STDOUT, STDERR, DATA, ARGV, ARGVOUTがある。これらの名前は通常は使用すべきではない。

5.7 ファイルハンドルをオープンする

  • STDIN, STDOUT, STDERRのファイルハンドルは自動的にファイルやデバイスに対してオープンされている。
  • 新たなファイルハンドルが必要な場合、open演算子によってコネクションをオープンする。
    • 入力用のオープン:open HOGE, 'hoge';またはopen HOGE, '
    • 出力用のオープン(上書き):open HOGE, '>hoge';
    • 出力用のオープン(追記):open HOGE, '>>hoge';
  • Perl5.6以降では入出力のモードを引数で指定できる。さらにエンコーディグ指定も可能。
5.7.3 ファイルハンドルをクローズする
  • close HOGE;
  • オープン済みのファイルハンドルを再びオープンするとオープン前に自動的にクローズされる。
  • プログラムが終了する際も自動的にクローズされる。

5.8 dieによって致命的エラーを発生させる

  • Unixその他多くのOSで実行されるプログラムは、成功したか否かを示す終了ステータスを返す。
    • 成功:0、失敗:0以外 である場合が普通。
  • die関数はエラーメッセージを標準エラーストリーム(STDERR)に渡してから0以外の終了ステータスでプログラムを終了させる。
  • システムが要求を拒否した場合に通知されるメッセージは変数$!に入っている。
if (! open LOG, '>>', 'logfile' ) {
    die "Cannot create logfile:$!";
}
  • メッセージの末尾に改行文字が含まれない場合、メッセージにはファイル名と行番号が含まれる。
5.8.1 warnによって警告メッセージを表示する
  • warnはdieと概ね同じ動作をするが、プログラムを終了させない。
5.8.2 自動的にdieする
  • autodieプラグマを書いておけばopen失敗時に自動的にdieする。(Perl 5.10以降)

5.9 ファイルハンドルを使う

  • 入力用にオープンしたファイルハンドルからは行入力演算子を用いてファイルの中身を読むことが出来る。
open HOGE, 'hoge';
while(<HOGE>){
    chomp;
    ...
}
  • printやprintfの出力を出力用に開いたファイルハンドルに送るには引数リストとprintの間にファイルハンドルを置く。
5.9.1 デフォルトの出力ファイルハンドルを変える
  • select演算子を使ってデフォルトの出力ファイルハンドルをSTDOUTから変えることが出来る。
  • デフォルトでは各ファイルハンドルに対する出力はバッファリングされるが、変数$|に1をセットすると現在選択されているファイルハンドルは出力の度にフラッシュされるようになる。

5.10 標準ファイルハンドルを再オープンする

  • 新しいコネクションのオープンが成功した場合に限り、元のファイルハンドルはクローズされる。

5.11 sayを使って出力する

  • Perl5.10はPerl6からsay組み込み関数を借用してている。
  • sayはprintと似たようなものだが末尾に改行文字を付け加える。

5.12 ファイルハンドルをスカラー変数に入れる

open my $hoge_fh, '<', 'hoge.txt'
    or die "Could not open hoge.txt: $!";
print $hoge "...";
close $hoge;
  • ファイルハンドルの直後にコンマが無いことによってファイルハンドルであることが認識される。
  • ファイルハンドルとして扱うべきものを明示的に示すためにはブレースで囲む
print { $hoge }; # $_の中身を表示