Perl入門
> 第6章 ファイル操作とファイルハンドル
第6章 ファイル操作とファイルハンドル
6-1. 標準入出力
Perlでは、ファイルの入出力に
ファイルハンドル
というものを使います。
ファイルハンドル
とは、今どのファイルを処理しているかを管理するための名前のことです。
ファイルの読み込みや書き込みをするには、まずファイルを開いて
ファイルハンドル
に関連付けし、その
ファイルハンドル
を操作するのが基本手順になります。
Perlでは、特別な
ファイルハンドル
として、以下の3つが用意されています。
ファイルハンドル
意味
内容
STDIN
標準入力
パイプ ( *1 ) やリダイレクト ( *2 ) 時にデータを取り込む。コマンドライン時にはキーボード。
STDOUT
標準出力
パイプやリダイレクト時にデータを出力する。コマンドライン時にはモニター。
STDERR
標準エラー
エラー時に出力される。
*1 : 標準出力と標準入力を経由してデータを受け渡しする仕組みで、あるプログラムが標準出力に出力した結果を、他のプログラムの標準入力に渡す仕組みをいいます。
*2 : 標準出力をそのままのテキストファイルなどに書き出す方法をいいます。
たとえばコマンドラインから操作する場合には、以下のようなスクリプトを実行することができます。
<スクリプト例>
#!/usr/local/bin/perl
print "
お名前は? \
n";
$name = <STDIN>;
print "
こんにちは、
$name
さん\
n";
<出力結果>
お名前は?
> TARO
(← キーボードから入力)
こんにちは、TAROさん
このように、キーボード入力を標準入力であるファイルハンドルSTDINから変数$nameにセットし、文字列を操作・表示させることができます。
6-2. open関数とファイルハンドル
前節ではあらかじめ用意された標準のファイルハンドルを説明しましたが、それ以外のファイルハンドル以外を使う場合には、
open関数
を使用します。
open関数
を使ってファイルを読み込む場合の構文は次のようになります。
▼ファイルを読み込みモードでオープンする場合 (open命令)
open ファイルハンドル, "ファイル名";
▼ファイルを読み込む処理 (read命令)
配列 = <ファイルハンドル>
▼ファイルのオープンを閉じる処理 (close命令)
close ファイルハンドル
たとえばこの一連の処理として、掲示板などで記録ファイルを配列として読み込むには、次のように記述します。(読み込むファイル名をここでは log.txt と仮定します)
記述例
1| open(IN,"log.txt");
2| @file = <IN>;
3| close(IN);
内容
1| 記録ファイルを、INというファイルハンドルで読み込む。
2| 読み込んだ記録ファイルを配列@fileにセットする。
3| 読み込み処理を閉じる。
記述例の場合、ファイルハンドル名は「IN」という名前を使っていますが、これは自由に名前を指定して構いません。ただし、一般的には
英字大文字で指定
するようになっています。
なお、記述例の 1 の部分、ファイルの読み込み処理で、
open(IN,"< log.txt");
というように、
<
を付ける場合もあります。意味は同じです。
6-3. ファイルの読み書き
ファイルに書き込み操作を行う場合にも、open関数とファイルハンドルを使います。
open関数によるファイルの読み書き操作としては、次のような構文が用意されています。
意味
構文
読み込みモードでオープン
open (FH, "file")
open (FH, "< file")
上書きモードでオープン
open (FH, "> file")
追加書き込みモードでオープン
open (FH, ">> file")
読み書き両用モードでオープン
open (FH, "+> file")
open (FH, "+< file")
パイプ出力用でオープン
open (FH, "|
コマンド
")
パイプ入力用でオープン
open (FH, "
コマンド
|")
ファイルの上書き
open(OUT,"> log.txt");
print OUT "DEF";
close(OUT);
<解説>
log.txtに「DEF」という文字列を上書きします。
上書きですから、log.txtの中身を消して新たに書き込むことになります。
仮に、当初 log.txt の中に「ABC」という文字列があった場合、上記の処理後
中身は「DEF」となります。
追加書き込み
open(OUT,">> log.txt");
print OUT "DEF";
close(OUT);
<解説>
log.txtに「DEF」という文字列を追加書き込みします。
追加書き込みですから、log.txtの中身のに追加連結することになります。
仮に、当初 log.txt の中に「ABC」という文字列があった場合、上記の処理後
中身は「ABCDEF」となります。
コマンドからパイプ入力用にオープン
open(IN,"ls -l |");
@cmd = <IN>;
close(IN);
foreach $cmd (@cmd) {
print "$cmd
\
n";
}
<解説>
ls -l (カレントディレクトリ内のファイル名を取得) というコマンド
を実行し、その結果を配列@cmdに格納し、表示する。
コマンドへパイプ出力用にオープン
open(OUT,"| /usr/sbin/sendmail");
print OUT "HELO
\
n";
close(OUT);
<解説>
sendmailへ HELOコマンドを出力。
6-4. その他のファイル操作
その他にファイル操作のための関数として、次のようなものがあります。
ファイルを削除
unlink ファイル名
ファイル名を変更
rename "変更前のファイル名", "変更後のファイル名"
戻る