標準ファイル入出力2
■この章で解説する組み込み関数
print, printf
■この章でできること
・行入力演算子を使う
・ファイルからテキストデータを読み込む
・ファイルにテキストデータを書き出す

 ここでは標準ファイル入出力を使ったファイルの読み書きの方法を解説します。ファイルのオープンやオープンモードについては標準ファイル入出力1を参照してください。

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

#!/usr/bin/perl

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

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

# ファイル内容を読み込み
while (<HFILE>)
{
    push(@data, $_);
    print "$_";
}

# クローズ
close(HFILE);

# 書き込み用にオープン
open(HFILE, ">file02_02.txt") or die($!);

# ファイルに書き出し
print(HFILE @data) or die($!);

# クローズ
close(HFILE);

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

[g@630m pl]$ perl file02_01.pl
abcdefg
hijklmn
opqrstu
[g@630m pl]$ cat file02_02.txt
abcdefg
hijklmn
opqrstu
[g@630m pl]$

 ファイルからテキストデータを読み込むには、行入力演算子<filehandle>を使います。この演算子はファイルから1行ずつデータを読み込みます。行入力演算子は、ファイルのどこまで読み込んだかを覚えています。上のサンプルでは、ファイルから1行ずつ読み込み、ファイルの最後まで読み込むと未定義を返すので、ループを抜けます。

 次はファイルへの書き出しですが、これはprint関数を使います。print関数ではファイルハンドルの後にカンマを付けないので注意が必要です。ファイルハンドルを省略した場合はSTDOUTに出力します。

print
指定したファイルハンドルにデータを書き出す。ファイルハンドルを省略した場合はSTDOUTに出力する。
書式
print [filehandle] list
引数
filehandle:
ファイルハンドル
list:
書き出すデータ。リストコンテキストで評価される。
戻り値
成功した場合は1。失敗した場合は0。

 行入力演算子をリストコンテキストで使うと、ファイルのデータを一度に読み出すことができます。次にそのサンプルを示します。

#!/usr/bin/perl

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

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

# ファイル内容を読み込み
@data = <HFILE>;
print "@data";

# クローズ
close(HFILE);

 このほか、printf関数を使うと、文字列をフォーマットしてファイルに書き出すことができます。以下にそのサンプルを示します。

#!/usr/bin/perl

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

# 書き込み用にオープン
open(HFILE, ">file02_03.txt") or die($!);

# 文字列をフォーマットして書き出し
printf(HFILE "%d %f\n", 3, 4) or die($!);
printf(HFILE "%c %s\n", 65, "hello") or die($!);

# クローズ
close(HFILE);

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

[g@630m pl]$ perl file02_03.pl
[g@630m pl]$ cat file02_03.txt
3 4.000000
A hello
[g@630m pl]$

 printf関数に指定するフォーマットはsprintf関数と同じですので、そちらを参照してください。

printf
指定したファイルハンドルに、フォーマットした文字列データを書き出す。ファイルハンドルを省略した場合は現在選択されている出力ファイルハンドルに出力する。
書式
print [filehandle] format, list
引数
filehandle:
ファイルハンドル
format:
フィールド指定子を埋め込んだ文字列
list:
各フィールドを置き換える要素
戻り値
成功した場合は1。失敗した場合は0。