今日のCPANモジュール(跡地)

宣伝と注意書き

このサイトが元になったCPANモジュールガイドという本を書きました。

本ではこのモジュールの後継モジュールであるautodieを紹介しました。

2007-02-07

use Fatal;

ファイルを開いてごにょごにょする処理はありがちですが、以下のようなサンプルを見かけることがあります。

$file = "file.txt";
open FH, "< $file" or die "Can't open $file: $!";
while (<FH>) {
    # 処理...
}
close FH or die "Close $file failed: $!";

open や close は、失敗したときに undef を返すので、エラー処理のため or die が2回入ってますが、この何個も並ぶ or die を書かなくてよくなるちょいと便利なモジュールが Fatal です。上の例はこんな感じになります。

use Fatal qw(open close);

my $file = "file.txt";

open my $fh, '<', $file;
while (<$fh>) {
    # ...
}
close $fh;

Fatal が、渡されたサブルーチン(上の例だと open と close) をくるんで、自動で or die してくれます。open や close がだいぶすっきりしました。あとついでに先ほどの例に対してファイルハンドルを変数にしたり open を3引数にと今風に変更してみてあります。

Fatal は Perl 5.00307 以降コアモジュールなので、たいていはどこでも最初から入っています。エラー処理をしつつ、コードもすっきりするのでおすすめです。

:void

一個オプションがあって、:void という特別な名前を渡して use すると、先ほどの例のようなものは普通に Fatal するのですが、if 文の中にあるような、返り値が評価される場合にはたとえ undef が返ってきたとしても Fatal しなくなります。

use Fatal qw( :void open );

if ( open my $fh, '<', $file ) { # Fatalしない
    # 自分で処理を書きたい場合
}

open my $fh, '<', $file; # Fatalする

ぼくはもっぱら open と close にしか使ってないですが、

use Imager;
use Fatal qw( Imager::read );

my $img = Imager->new;
$img->read(file => "dummy");

ていう風に他モジュールのサブルーチンを Fatal 化したり、

sub foo {

}

use Fatal qw( foo );
foo();

みたいに自作のルーチンを Fatal 化するのも一応可能です。どちらも、Fatal が use される前にサブルーチンが宣言されている必要ありですが。あんまりやらないですね。

SEE ALSO

Fatal