今までで基本的なデータ型を理解し、条件分岐や繰り返しなどの制御構造も見てきました。 チョットずつスクリプトが書けるようになってきたと思います。 ここで、入出力についてまとめておきましょう。
まず、標準入力とは、プログラムへデータを渡す際の、デフォルトの仮想的入り口のことで、通常はキーボードに割り当てられています。 また標準出力とは、プログラムからデータを受け取る際のデフォルトの仮想的出口のことで、通常はコンソール画面に割り当てられています。 さらに、標準エラー出力とは、プログラムからエラーメッセージを受け取る際のデフォルトの仮想的出口のことで、通常はコンソール画面に割り当てられています。
Perlでは、ファイルの入出力にはファイルハンドルという物を使います。 ファイルハンドルとは「スクリプトとファイルを結びつける物」と思ってください。 Perlはこのファイルハンドルによって個々のファイルにアクセスしたり、ファイルにデータを書きこんだりします。 Perlでは、標準入力、標準出力、標準エラー出力はそれぞれ、STDIN、STDOUT、STDERRという特別なファイルハンドルによって管理されています。
標準入力からデータを受け取る際には行入力演算子<>が使われます。 <と>の間にはファイルハンドルが入ります。 ですから<STDIN>は標準入力からデータを受け取ることを意味します。 <STDIN>をスカラーコンテキスト(「§3.5 コンテキスト」参照)で評価すると、次の1行を読みこみ、スカラー値として返します。 EOF(End Of File(control+D))が入力されると未定義値を返します。
$input = <STDIN>;
上のコードがあると、Perlの処理は一度止まり、ユーザからのデータ入力を待ちます。 そしてユーザがEnterキーを押すまでデータを読み込んで$inputに代入します。 その際、最後に押したEnterキーのせいで、$inputには改行文字も入っています。 これを取り除くためにはchomp関数を使います。 chomp関数は以前にも使いましたね(「§1.2 あなたのお名前なんて−の?」参照)。
$input = <STDIN>;
chomp($input);
#上のコードを1行にまとめると…
chomp($input = <STDIN>);
また何行にもわたる入力を受け取る場合には前章で紹介したループ構造と組み合わせて使用します。
while(chomp($input = <STDIN>)){
last if ($input eq "\cD");
print "$input";
}
上のスクリプトは、キーボードから受け取ったデータを、改行文字を除いてから表示する物です。 control+Dを入力してEnterキーを押すと終了します。 またデータの入力がSTDINの場合は、特殊変数$_を使って上のコードをもっと簡単に書くことも出来ます。
while(<STDIN>){
chomp;
last if ($_ eq "\cD");
print;
}
このようにすると、STDINからの入力は特殊変数$_に代入されます。 chompやprint関数は引数を省略すると$_に対して処理をするので上のように書くことが出来るのです。
次に<STDIN>をリストコンテキストで評価すると、EOFまでを一気に読みこみ、改行文字までを各要素とするリストを返します。
@input = <STDIN>;
次の節では標準出力からの出力についてお話します。