ファイルハンドル


コマンドラインを意識する

これまでのファイルハンドルは、開かれたファイルに対して私たちが作ってきましたね
しかし、それ以外にもあらかじめ定義されているファイルハンドルが存在します
その代表的なファイルハンドルがSTDINだと思います

STDINは標準入力を指すファイルハンドルです
ということは当然標準出力を指すファイルハンドルもあるということになります
はい、print関数はファイルハンドルを省略すると必然と標準出力を指していたことになります

STDINが標準入力ならば、標準出力もある程度想像がつくでしょう
STDOUTが標準出力です
さっそく試してみましょうか
	print STDOUT "標準出力にょ\n";
これまでのprint関数同様の結果が得られるはずです
つまり、ファイルハンドルを省略するとprint関数はプログラマの見えないところでSTDOUTファイルハンドルを指定していたのです

なぜ標準出力を指定するのかというと、標準出力は通常は画面であるというだけです
ということは、画面以外に出力することもありえるのです
これはプログラムではなく、プログラムを実行するユーザーが指定することになります
画面以外の標準出力先は、たとえば他のファイルやプリンターが考えられますね

この標準出力の設定はコマンドラインから行なえます
たとえばWindowsならば「スタート→プログラム→MS-DOSプロンプト」を指定してください
おそらく今までは次のように実行していたと思います

perl file-name.pl

このときに標準出力をファイルに変えることができます(リダイレクトという)

perl std.pl > test.txt

上のコマンドを実行した場合、std.plというPerlスクリプトを実行して、標準出力を全てtest.txtに書き出します
つまり、いままでprint関数で画面に出てきた文字が画面ではなくファイルに書き込まれます


ですが、これでは困ったことになります
ユーザーがファイルを標準出力としてプログラムの内容を書き出しているときに
何らかの事象でプログラマには好ましくないエラーが発生したとします

プログラムがユーザーに「エラーがでたぞ」と教えたくても標準出力は使えないです
標準出力は全てファイルに書き出されているので、画面には出てきません
そこで標準エラー出力というものがあります
open関数の dieやwarn がメッセージとして出力していた先こそ標準エラー出力です

標準エラー出力のファイルハンドラはSTDERRです
さっそく試してみましょう
	print STDOUT "標準出力にょ\n";
	print STDERR "エラー出力にょ\n";
普通にプログラムを実行すると両方とも画面に出力されます
しかし、標準出力をファイルなどにリダイレクトすると標準エラー出力だけが出力されます

もちろんtest.txtファイルを見ると、標準出力された文字列が書き込まれてます
これでSTDINファイルハンドラの謎も解けたと思います


コマンドラインから引数を受け取る

前回簡易テキストエディタっぽい(簡易テキストエディタとすら呼べない代物なので)サンプルを作りました
これはスクリプトの中でファイル名を指定させてファイルをオープンしました
しかし、コマンドラインからファイル名を引数として受け取れないでしょうか?

実は、コマンドラインからの引数はリストとして @ARGVに代入されています
さっそく実験してみましょう
	for ($re = 0 ; $re < @ARGV ; $re++) {
		print "第$re引数 = $ARGV[$re]\n";
		}
コマンドラインから、好きな文字を引数としてプログラムに与えてください
ちゃんと引数として受け取られていることが確認できると思います
引数としてファイル名を受け取れば、先ほどのテキストエディタもどきを改良できます
	$file_name = $ARGV[0];
	chomp($file_name);

	open(FILE , ">>$file_name") || die "引数でファイル名を指定してください";

	print "書き込みます\n";
	until ($str eq "exit\n") {
		print FILE $str;
		$str = <STDIN>;
		}

	close(FILE);



前のページへ戻る次のページへ