File Handle - まとめ

last-modified: 12th/August/'01;
since: 1st/June/2001;

「ファイル・ハンドル」とは、「ファイルを摘み上げるためのハンドル」です。このハンドルでファイルを摘み上げ、 Perl の実行環境に1行ずつ入出力します。

本節までで、入力用ファイル・ハンドル、出力用ファイル・ハンドル、標準入出力ファイル・ハンドル STDIN, STDOUT を紹介しました。ここでは、以上を踏まえて、ファイル・ハンドルについてまとめておきます。

一般的なファイル・ハンドル

ファイルハンドルは、ファイルのハンドルだと説明しましたが、実際にはデバイスやパイプに対しても付けられます。いずれにせよ、その役割は入力・出力の制御です。

ここではその基本的な利用法についてまとめておきます。

因みに、ファイルハンドルの命名法は、幾つかの予約語を除いて殆ど制限がなく、自分でつけられます。しかし、 Perl の予約語と重複しないように、スクリプト中では大文字を用いるように推奨されています。以下では、ファイルハンドルは FH としますが、 HOGE でも PIYO でも IN でも OUT でも構いません。好きなように読み替えてください。

ファイルハンドルと結びつけるファイルは何でも構いません。以下では、 file.dat というファイルと、ファイルハンドル FH を結び付けています。

用途スクリプト説明
入力専用 opne(FH, "file.dat");
open(FH, "<file.dat");
良く使うので < は省略可。
出力専用 open(FH, ">file.dat"); オープン時にファイル内容は削除される。
入出力共用 open(FH, "+<file.dat"); 元の内容の後に追加。
追加出力用 open(FH, ">>file.dat"); オープン時にファイル内容削除。
入力追加出力共用 open(FH, "+>file.dat"); 元の内容を残してファイルをオープン。

open は、スカラーコンテキストでは、オープンに成功すれば 0、失敗すれば 0 以外を返します。

以上のようなファイル-ファイルハンドル結合を解除する場合は、 close を用います。

close(FH);

特殊なファイル・ハンドル

STDIN
標準入力:パイプやリダイレクト時にデータを取り入れる。コマンドラインの実行時のデフォルトではキーボード。 CGI の POST メソッドで送信された情報もここから入力される。
STDOUT
標準出力:パイプやリダイレクト時にデータを出力する。コマンドラインの実行時のデフォルトはモニタ。
STDERR
標準エラー出力:

ファイルハンドルへの出力

ファイルハンドルと結びついたファイルへの出力方法を紹介します。

open(FH, ">file.dat");
  while($line = <STDIN>){     #STDIN は予め標準出力装置と結合しているのでオープンの必要なし。
    print FH "$line","\n";
  }
close(FH);

上のサンプルでは、 file.dat を出力用ファイルとしてファイルハンドル FH に結び付けています。

while ループでは、標準入力 STDIN (キーボード入力)を1行ずつ $line に代入し、ブロック内を繰り返します。

ブロック内の print 函数に複数の引数が与えられています。第0引数は出力用ファイルハンドルを意味し、第1引数以降が出力内容を表します。標準出力 <STDOUT> の場合は第0引数のファイルハンドルを省略できます。

print STDOUT "Hello, World!\n"; #STDOUT は省略可能
print "Hello, World!\n";        #上の行と同じ

ファイルハンドルを変数で与えることも出来ます。

$handle = FH;
print $handle "Hello, world!\n";

ファイルハンドルからの入力

ファイルハンドルと結びついたファイルからの入力方法を紹介します。

open(FH, <file.dat);
  while($line = <FH>){
    print STDOUT "$line";
  }
close(FH);

略記法利用:

opne(FH, file.dat);    #入力の < は省略可
  while(<FH>){         #変数省略時には $_ に自動的に代入される
    print;             #STDOUT と $_ は省略可能
  }
close(FH);

ファイルハンドルからの入力は <FILEHANDLE> を利用します。ファイルの終了 (EOF; End of File) に達すると、未定義値を返すので、条件式中ではファイル終了と共に「偽」を返すことになります。 上のスクリプトでは、二行目の <FH>while ループの繰り返し条件に使われていますので、ファイル終了と共に繰り返しが終了することになります。

また、ここでは代入変数が省略されているので、標準変数 $_ に代入されます。

この while ループは、ファイルから一行読み込んで出力し、次の行を一行読み込んで出力し……と繰り返すことになります。

空の入力演算子 <>

空のハンドルに対する入力演算子 <> は、コマンドライン(@ARGV に代入される)で指定されたファイル名に対するファイルハンドルとして機能します。コマンドラインでファイル名が与えられなかった場合は、標準入力に対するファイルハンドルとして機能します(<STDIN> と同じ)。

while(<>){
	print "$.; $_";  #$. は繰り返し回数、 $_ は標準変数
}

上記のスクリプトが cat.pl に記述されていたとして、次のように実行された場合、どのような動作をするでしょうか?

% perl cat.pl (.*)\.htm(.*)

結果は、当該ディレクトリ上の全ての HTML ファイルの内容を、標準出力装置に出力します。

% perl cat.pl

上記のように、コマンドラインで引数を与えなければ、標準入力と等価です。

die 函数

ファイルのオープンに失敗しても、 perl は引き続きスクリプトを実行し続けます。このとき、ファイルオープン成功を前提に記述された、後続のスクリプトがどのような動作をするか、予測しがたいため、通常はオープン失敗と共に、スクリプトの実行を中止させます。

open (FH, "file.dat") || die "Can't open file: $file";

||or と同じで、前半部が偽である場合だけ、後半部を実行します。前半部が真であれば、後半部は無視されます。

or|| に比べて優先度が低く設定されていますが、それ以外は等価です。

Copyright SUGAI, Manabu. Since: 1st/Jun./2001
FC2> モビット