Perlの関数を成功しなければ die するものに置き換えるプラグマモジュール 「autodie」
Perl という言語はえらく親切で、他の言語ではエラーで止まるような場合でも 「こうしたいんでしょ?」 みたいな感じに気を利かせてくれて、処理を続行してくれたりします。
もちろんそれが有りがたい場合もあるわけですが、そうじゃない場合だってあるじゃないですか。で、そういう時に autodie プラグマを使うと、ちょっとだけ幸せになれそうです。
機能としては、Perl の動作を
レキシカルスコープ内の関数を、成功しなければ die するものに置き換える
autodie - perldoc.jp より引用
というように変えてくれます。
例えばファイルを読み込みモードでオープンしようとして、そのファイルが無かった場合、autodie を指定していなければ Perl は空のファイルが有ったものとして処理してしまいます。
まぁ、大抵の場合はそれでも問題が無かったりするわけですが、止まって欲しい時もありますよね。
そういう場合は、前もってファイルの存在をチェックして・・・、ということをするわけですが、「止まってくれればOK」 という場合もあったりします。
そういう時に autodie を指定していると、open に失敗した時点で止まってくれます。
サンプルコードは以下の通り。これを test.pl の名前で保存して、読み込む予定のファイル(ここでは test.txt)の存在しない環境で実行します。
#!/usr/bin/perl use strict; use warnings; use autodie; open(FH, "<", "test.txt"); print "OK\n"; close(FH);
実行結果は次のようになります。
Can't open 'test.txt' for reading: 'No such file or directory' at C:\work\test.pl line 7
7行目がエラーになって止まるわけですね。ちなみに 「use autodie;」 の行をコメントアウトして実行すると、“OK” と表示されて終了します。
ただし、全ての組込み関数の動作が置き換わるわけではないので、そこは注が必要です。確認したところ、動作の置き換わる関数は以下の通りでした。
accept bind binmode chdir close closedir connect dbmclose dbmopen fcntl fileno flock fork getsockopt ioctl link listen mkdir msgctl msgget msgrcv msgsnd open opendir pipe read readlink recv rename rmdir seek semctl semget semop send setsockopt shmctl shmget shmread shutdown socketpair symlink sysopen sysread sysseek syswrite truncate unlink
autodie - search.cpan.org より(バージョンは2.13)
実は宣言を 「use autodie qw(:all);」 もしくは 「use autodie qw(:system);」 とすることで、関数 system と exec についても置き換えられるようなのですが、Windows の Active Perl では IPC::System::Simple が入ってないと言われて使えませんでした。残念。
それから、autodie は 5.10 から標準モジュールになっているそうなので、それ以前のバージョンの Perl には、別途インストールが必要となります。