ファイルオープン時のエラー処理

広告

「open」関数を使ってファイルを開こうとして失敗した場合、プログラムの実行を中断するには「die」関数を使ってプログラムを終了させる方法がよく使われます。(「die」関数については「die関数」を参照して下さい)。

「open」関数は失敗すると未定義値(undef)を返しますので次のように「if」文を使って記述することが出来ます。

if (!open(DATAFILE, "data.txt")){
  die("error :$!");
}

又は「unless」文を使って次のように記述することも出来ます。

unless (open(DATAFILE, "data.txt")){
  die("error :$!");
}

この記述方法でも問題はありませんが、Perlでは「or」演算子を使って次のように記述する場合が多いです。

open(DATAFILE, "data.txt") or die("error :$!");

「or」演算子は左辺の式をまず評価します。左辺が真の場合は右辺は評価せずに次の行へ進みますが、左辺が偽の場合は右辺を評価します。その為、上記の式は左辺に記述された「open」関数をまず実行し結果を評価します。「open」関数が成功すればそのまま次の行へ進みますが、「open」関数が失敗し「undef」を返してきた場合には「undef」は偽(false)として扱われますので右辺を実行します。結果的に「open」関数が失敗した場合にだけ「die」関数が実行されることになります。

どの記述方法でも同じなのですが、簡潔に記述でき分かりやすい(if修飾子を使うと先に「die」関数が来てしまう)ので「or」演算子を使った記述がよく使用されているようです。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test3-1.pl

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

open(DATAFILE, "data.txt") or die("error :$!");
print "data.txtを開く事に成功しました¥n";

close(DATAFILE);

open(DATAFILE, "data1.txt") or die("error :$!");
print "data1.txtを開く事に成功しました¥n";

close(DATAFILE);

上記を「test3-1.pl」の名前で保存します。保存する時の文字コードは「UTF-8」として下さい。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

ファイルオープン時のエラー処理

今回はプログラムと同じディレクトリに「data.txt」と言うテキストファイルを用意してあります。その為、「data.txt」ファイルを開く事は成功しますが「data1.txt」ファイルは存在しないのでファイルを開くことに失敗しエラーを表示してプログラムを終了しています。

( Written by Tatsuo Ikura )