10.7節,for より foreach を使うほうが perl らしい書き方.
10.9節,論理演算子 "&&""||" は C 言語と同様.ショートカットが行われることに注意. これが「制御構造」の章に演算子の内容が書いてある理由である.
<STDIN>,<STDOUT> など,自動的にオープンされている ファイルハンドルは,特別なことをしなくても利用できる. <STDIN> は標準入力,<STDOUT> は標準出力を示す. プログラムがキーボードから入力したり,ファイルから入力したりで きるように OS が入出力先を抽象化している.
デフォルトでは 標準入力 はキーボードに,標準出力 はディスプレイに 接続されている.コマンドラインで "<" や ">" 記号を使って接続先をファイルに変更することが できる.これは Unix の「シェル」の機能である.
p.122 のパターンテストプログラムを例に説明する. "<>" 演算子は(コマンドラインからファイル名が与えられない場 合は) STDIN から読み込みを行う."print" 文は,後述の ファイルハンドルが明記されない場合,STDOUT へ書き出す. p.122 のパターンテストプログラムは標準入力から読み出しを行い, 標準出力へ書き込むプログラムである.
Unix のシェルに対して "<" 記号を用いて標準入力を ファイルへ変更することができる.p.122 のパターンテストプログラム のファイル名が match.pl であれば,コマンドラインへ
% ./match.pl < indata
と入力することで標準入力をキーボードから indata という名前のファイルへ 切り換えることができる.上記コマンドを入力する前にキーボードから入力予 定であったものをそのまま書きこんだファイル indata をカレントディレクト リに作成し,実行してみよ.
">" 記号を用いて標準出力を ファイルへ変更することができる. コマンドラインへ
% ./match.pl < indata > outdata
と入力することで indata という名前のファイルから入力し, outdata という名前のファイルへ出力するように変更できる. 実行して確認せよ.
前節のように自動でオープンされているファイルハンドルに プログラムの外からファイルを割り当てるやりかたの他に, プログラム内でユーザが入出力用にファイルをオープンすることができる.
open INFILE, "< file1"; open OUTFILE, "> file2"; open APPEND, ">> file3";
は,上から file1 を入力用に開く, file2 を出力用に開く, file3 を追加出力用に開くという意味である.それぞれシェルに対して入力す る文字と同じ記号が使われている.> は一旦出力用ファイルを空にして 新しい内容だけを書き込むのに対し,>> は古い内容を残したまま,後 に新しい内容を追加する.< も > も付かない場合は < を指定した のと同じ意味になる.
% ./match.pl < indata >> outdata
を実行してシェルに対して同様の出力を指定することができる.
close INFILE;
で,INFILE というファイルハンドルでオープンしていたファイルをクローズ できる.使い終ったファイルはすみやかにクローズすべきである.
11.3 die
ファイルのオープンは失敗する可能性がある.
open INFILE, "< file1" or die "Cannot open file1: $!";
をファイルオープンの構文と思い,毎回この構文を使ってオープンを行う.
p.122 のパターンチェックプログラムを indata という名前のファイルから入 力するように変更するには,while ループの前に
open INFILE, "< indata" or die "Cannot open indata: $!";
を挿入し,while ループのテスト式を
while (<INFILE>){
に変更すればよい.変更して確認せよ.
同じプログラムを outdata という名前のファイルへ出力する ように変更するには,while ループの前に
open OUTFILE, "> outdata" or die "Cannot create outdata: $!";
を挿入して出力用にファイルハンドル OUTFILE を開き, print 文と引数リストの間にファイルハンドルを書けばよい. すなわち,もとのプログラムで print と書いてあるところを print OUTFILE に書きなおす.実際に変更して確認せよ.
第 4 回課題「ファイル入出力」 を読んで第 4 回課題を提出しなさい.