燈明ブログ

現状は小池啓仁の応援ブログ

Perlでのファイル処理について

Perlでのファイル処理は、以下の感じです。

  • 組み込み関数によるオープン・リード・ライト・クローズ
  • FileHandleモジュールによるオープン・リード・ライト・クローズ
  • ファイルテスト演算子によるファイル存在チェックやファイルサイズの取得等
  • ファイル操作関数によるファイル削除や名前変更等

◆組み込み関数によるオープン・リード・ライト・クローズ

すごく良い記事があったので引用させて頂きます(^^;

ファイルハンドルにはレキシカル変数を使うこと (本当に特別な用途がない限りは必須)

 ファイルハンドルには宣言したばかりのレキシカル変数を使います。レキシカル変数を宣言してそれをopen関数の第1引数に指定するとレキシカル変数にファイルハンドルが設定されます。

# レキシカル変数
my $fh;
my $file = 'file1';

open $fh, '<', $file
  or die "Cannot open '$file': $!";

while (my $lien = <$fh>) {
    # 行の読み込み
}

 レキシカル変数はスコープを持つということと他の関数に引数として渡すことができるという大きな利点があります。古い解説にあるようなFHや*FHなどのシンボルを使わないようにします。

 またレキシカル変数の宣言をopen関数の中にまとめてしまうのがより現代的であるといえるでしょう。

open my $fh, '<', $file

3引数のopen関数を使う (必須)

 3引数のopen関数を使用するようにします。

open my $fh, '<', $file

 古い解説では2引数のopen関数を解説しているものがありますが使わないようにしましょう。2引数のopen関数はセキュリティ的に脆いので使用してはいけません。

open my $fh, "< $file"; # 2引数のopen関数を使用してはいけない

ファイルオープン時のエラー処理を行う (必須)

 ファイルオープンを行ったときは必ずエラー処理を行うようにします。

open my $fh, '<', $file
  or die "Cannot open '$file': $!";

 open関数は失敗するとundefを返すのでorを使ってエラー処理を行います。$!にはOSが返したエラーメッセージが含まれているのでユーザに見せるエラーメッセージに含めるようにします。

 プログラムをエラーメッセージを表示して終了させるにはdie関数を使用します。他のプログラムから見た場合は終了コードは255になります。

 ファイルオープンに限らずプログラムの外部と通信する場合はかならずエラー処理を行うようにします。外部というのはメモリの操作を除くすべてです。ファイルやネットワークなどが外部になります。

http://d.hatena.ne.jp/perlcodesample/20091120/1246679588


尚、openの第二引数には以下があります。

  • '<' - 読込み用
  • '>' - 書込み用 (上書き)
  • '>>' - 書込み用 (追加)
  • '+<' - 読み書き用
  • '+>' - 読み書き用
  • '|-' - パイプ読込み用
  • '-|' - パイプ書込み用

◆FileHandleモジュールによるオープン・リード・ライト・クローズ

以下を参照願います。

◆ファイルテスト演算子によるファイル存在チェックやファイルサイズの取得等

以下を参照願います。

◆ファイル操作関数によるファイル削除や名前変更等

・ファイル削除のunlink

unlink 'ファイル名1', 'ファイル名2', ……;

my $c = unlink 'zzz.txt', 'yyy.txt';
print "-->$c<--\n";

引数には、削除するファイル名のリストを指定します。
戻り値は削除したファイルの数が返ります。

・名前変更のrename

rename '古いファイル名', '新しいファイル名';

if (rename 'xxx.txt', 'zzz.txt') {
    print "真\n";
}
else {
    print "偽\n";
}

戻り値は、リネーム成功時に真、それ以外は偽。

・その他のファイル操作関数