入出力(1) ファイルハンドル

今まで書いてきたプログラムは入力が無く、出力だけを行なうプログラムでした。さすがにこれだけでは面白くない上に実用的なプログラムが書けそうにないので、そろそろ入出力の仕方を勉強します。
print 関数を使うと標準出力に文字列を出力する事ができました。Windowsコマンドプロンプトからプログラムを実行した場合、標準出力はコマンドプロンプト画面となるので、出力した文字列はそのまま画面に表示されていたわけですね。

# hello.pl
print "Hello World!\n";
D:\home\palmo>perl hello.pl
Hello World!

もし、コマンドプロンプト画面で「>」(リダイレクト)を使って出力先ファイルを指定すると、標準出力はそのファイルに関連付けられます。つまり、この状態で print した文字列は、画面に表示されずにファイルに記録される事になります。

D:\home\palmo>perl hello.pl > hello.txt

D:\home\palmo>type hello.txt
Hello World!

「type」はファイルの内容を表示するコマンドです。hello.txt に print した内容が出力されているのがわかります。
ただし、このファイル出力は、あくまでユーザー側で標準出力をリダイレクトしているだけですので、プログラム側からは出力先ファイルを指定する事はできません。


perldoc -f print」を読むと、print の引数には「ファイルハンドル」(FILEHANDLE)を指定できる事がわかります。

    print FILEHANDLE LIST
    print LIST
    print

ファイルハンドルとは、主にファイルなどの「入出力の対象となるモノ」につけられる「識別子」の事で、C言語のファイルポインタに似ていますね。FILEHANDLE を省略して呼び出した場合、「標準出力」に出力されます*1。これが今までの print 関数の使い方ですね。
Perl では標準出力を表すファイルハンドルとして「STDOUT」が用意されているので、以下の2つの文は同じ意味になります*2

print "Hello World!\n";
print STDOUT "Hello World!\n";

どちらの print も標準出力に出力しているので、同じ意味ですね。print 関数にファイルハンドルを渡す際、ファイルハンドルの後ろには「,」(カンマ)が付かない事に注意しなくてはいけませんね。(^_^;)
実行結果は以下の通りです。

Hello World!
Hello World!

とりあえず標準出力への出力は簡単にできますね。(^_^)
ファイルを開いて、ファイルハンドルに関連付けられれば、ファイルを入出力先にできそうです。長くなるので別のエントリにします。

*1:select 関数を使うと、FILEHANDLE を省略した場合に用いられる出力先を変更できるそうです。

*2:厳密には select 関数を使う事で異なる出力先にする事もできます。