標準ファイル入出力1
■この章で解説する組み込み関数
open, close
■この章でできること
・ファイルをオープンする
・ファイルのオープンモードを指定する
・ファイルを作成する

 Perlでファイル入出力をする方法は大きく分けて2つあります。一つ目はC言語で言うところのfopenやfcloseに相当する、いわゆる標準ファイル入出力です。もう一つは、OSのシステムコールを直接呼び出す低水準ファイル入出力です。

 ここでは標準ファイル入出力について解説します。標準ファイル入出力では、読み込み時のバッファリングや、書き込み時の部分書き込みなどの処理を自動でしてくれます。低水準入出力を使う場合には、これらの処理は自力で行う必要があります。特に理由がなければ標準ファイル入出力を使ったほうがよいでしょう。

 では、まずは簡単なサンプルソースから見てみましょう。

#!/usr/bin/perl

#############################################
# 標準ファイル入出力のサンプル1
# Author: "Perl Programming Tips"
#############################################

# 読み取り専用にオープン
open(HFILE, "<file01_01.txt") or die($!);

# ファイル内容を読み込み
foreach (<HFILE>)
{
    print "$_";
}

# クローズ
close(HFILE);

 実行結果は次のようになります。

[g@630m pl]$ perl file01_01.pl
abcdefg
hijklmn
opqrstu
[g@630m pl]$

 あらかじめ作成しておいたテキストファイルfile01_01.txtを読み込んで、内容を表示しています。ファイルをオープンするには、open関数を使います。

open
指定したファイルを指定したモードでオープンする。
書式
open filehandle, filename
引数
filehandle:
ファイルハンドル
filename:
ファイル名(先頭にオープンモードを付加する)
戻り値
成功した場合は0以外の値。失敗した場合は未定義値。

 openが成功するとファイルハンドルに関連づけられます。以降のファイル操作はこのファイルハンドルを指定して行います。

 openで指定するファイル名には、ファイル名の先頭にオープンモードを表す文字を付けます。オープンモードの種類と動作は次のようになります。

ファイル名
動作
filename
読み取り:○ 書き込み:× 追加:× 新規作成:× 上書き:×
<filename
読み取り:○ 書き込み:× 追加:× 新規作成:× 上書き:×
>filename
読み取り:× 書き込み:○ 追加:× 新規作成:○ 上書き:○
>>filename
読み取り:× 書き込み:○ 追加:○ 新規作成:○ 上書き:×
+<filename
読み取り:○ 書き込み:○ 追加:× 新規作成:× 上書き:×
+>filename
読み取り:○ 書き込み:○ 追加:× 新規作成:○ 上書き:○
+>>filename
読み取り:○ 書き込み:○ 追加:○ 新規作成:○ 上書き:×

 オープンしようとしたときにファイルがない場合、新規作成するかエラーになるかはオープンモードによって変わります。上の表の「新規作成」の項目を参照してください。Perlではファイル作成専用の関数はありません。ファイル作成はopen関数で行います。

 このほか、「追加」モードでオープンした場合は、オープン直後にファイルポインタがファイルの末尾に置かれます。ファイルの末尾に追加書きするだけの場合はこのモードを使うとよいでしょう。

 注意しなければいけないのは、上の表で「上書き」になっているモードです。このモードは、ファイルをオープンしようとしたときにすでにファイルがあると、その内容を破棄して新規にファイルを作成します。既存の内容を破棄せずに、読み書きモードでオープンしたい場合は「+<」でオープンするとよいでしょう。

 実際の使用場面では、「既存のファイルがあればそのまま(内容を破棄せずに)読み書きモードでオープンし、既存のファイルがなければ新規に作成して読み書きモードでオープンしたい。」という場合が多いでしょう。これはopen関数を2回呼ぶことで実現できます。次にそのサンプルを示します。

#!/usr/bin/perl

#############################################
# 標準ファイル入出力のサンプル2
# Author: "Perl Programming Tips"
#############################################

# 読み書きモードでオープン
if (!open(HFILE, "+<file01_01.txt"))
{
    # ファイルが無ければ新規作成
    open(HFILE, "+>file01_01.txt") or die($!);
}

# クローズ
close(HFILE);

 最初のopenではファイルがある場合は読み書きモードでオープンし、ファイルが無い場合は失敗します。2回目のopenではファイルを新規作成して読み書きモードでオープンします。

 ファイルは使い終わったらclose関数でクローズします。

close
ファイルハンドルに結び付けられたファイル、ソケットなどをクローズする
書式
close filehandle
引数
filehandle:
ファイルハンドル
戻り値
なし