スポンサーリンク

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 には、別途インストールが必要となります。

参照リンク
 ・autodie - search.cpan.org
 ・autodieを試す - ymkoの日記

スポンサーリンク
コメント
Verify your Comment
Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

コメントを投稿
トラックバック

このページのトラックバックURL:
https://www.typepad.com/services/trackback/6a01310f1f31c0970c017c34d9b4e5970b

このページへのトラックバック一覧 Perlの関数を成功しなければ die するものに置き換えるプラグマモジュール 「autodie」:


プロフィール


  • 書いてる人:夢界 陸

    名古屋在住のおっさん。
    プログラミングやガジェットの話など、 日々の興味を徒然と綴っています。



    Twitterやってます @mukairiku

    運営サイト
    www.mukairiku.net

ブログ内検索

Licenses

  • Creative Commons License

OTHER

  • このブログのはてなブックマーク数

Blog powered by TypePad

スポンサーリンク