blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_0

Perl 「 ファイルハンドル 」: "die" (0x48)

Perl 「 ファイルハンドル 」: die (0x48)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x49 回。

Perl のプログラムを強制的に終了させる「 die 」関数について。




die 関数



「 die 」関数を使えば、プログラマは Perl プログラムに対して、意図的に致命的なエラー (例外) を発生させることが出来ます。

例えば、「 もしファイルハンドルのオープンに失敗した場合 」には、プログラムを強制的に終了してメッセージを表示することが出来ます。

「 die 」関数の機能は、ファイルハンドルの操作に限定されるものではないので、「 もし * が出来なかった場合 」の例外処理として汎用的に利用出来ます。

書式



die 関数の書式は次の通りです。


die LIST


die 関数は、LIST で渡されたメッセージを STDERR ( 標準エラーストリーム ) に出力してから、「 0 」以外の終了ステータスでプログラムを終了します。

「 終了ステータス 」( Exit stats ) とは、プログラムがオペレーティングシステムに渡す、プログラム終了時の状態を表します。

通常終了ステータス「 0 」は、実行に成功したことを表すので、die 関数を使った例外的な終了時には「 0 」以外を返します。

die 関数を利用する



例えば、ファイルハンドルのオープンの成否を判断したい場合には、次の様に書くことで確認することが出来ます。


my $result = open FILE, '>', 'file';
if ( ! $result ) {
# open が失敗した場合の処理
:
.
}


1 行目では、open 演算子の真偽値をスカラ変数 $result に代入しています。「 真 」の場合は成功で、「 偽 」の場合は失敗です。

2 行目では、if 文を使って変数 $result を判定しています。条件式に「 ! 」が前置されているので、これは「 偽 」だった場合に真となります。

if 文のブロック内では、ファイルハンドルのオープンに失敗した場合の処理を書きます。

die 関数を使った場合は次の様になります。


if ( ! open FILE, '>', 'file' ) {
die "Cannot open File Handle for connection: $!";
}


if 文の条件式は前出の例にも適用出来ますが、ファイルハンドルのオープンが失敗した場合の処理がスマートに書かれています。

この場合、die 関数は、「 LIST 」に書かれたメッセージを出力してプログラムを終了します。

「 LIST 」の末尾にある「 $! 」は、Perl が持っている特殊な変数で、なぜ要求が失敗したのかを説明する、システムからのメッセージがセットされます。

例に出したプログラムの場合は、大抵「 permission denied 」や「 file not found 」といったメッセージがセットされます (Unix システムであれば)。

die 関数の「 LIST 」から「 $! 」を除外しても構いませんが、多くの場面では「 $! 」を含めておいたほうが親切です。

ただし、システムへの要求以外の場合では「 $! 」を除外した方が良いそうです。意味のあるメッセージが得られないからです。

「 システムへの要求以外 」がどいう場面なのかは今の僕には分かりませんが、無暗に使うものではないと認識しておきます。

プログラムファイル名と Chunk number



die 関数はまた、「 LIST 」のメッセージ、「 $! 」のメッセージに加えて、該当するプログラムのファイル名と、問題があると想定される部分の行番号 (Chunk number : 正確には行の番号ではないが、ほとんどの場合は行番号と同じ) を表示してくれます。

例えば次の様に。


My Message: file not found at programfile line 10.


プログラムをデバッグする場合に、行番号が表示されるのはとても助かることです。プログラマにとっては大変有用な機能と言えるでしょう。

しかしながら、反対に、プログラムを利用するだけのユーザにとっては不要なメッセージとも言えます。

そういう時は、次の様に改行を含めます。


die "Message: $!\n";


こうすれば、プログラムファイルの名前と Chunk Number は表示されなくなります。

ユーザにとってはシステムからのメッセージも不要な場合が多いでしょう。

そういう時は、「 $! 」も省いてしまいます。


die "Message\n";


ちなみに、次の様にするとファイル名と行番号だけを表示します。


die "Message";


使いどころは特にないと思いますが、die 関数の「 LIST 」内で、改行文字「 \n 」が果たす役割がよく分かるかと思います。

or die



前出の例では、if 文の条件式を利用して die 関数を使いましたが、インターネットにある多くの例では、次の様に「 or 」演算子を使うケースがほとんどです。


open FILE, '>', 'file' or die "Message: $!";


こちらの方が可読性が高くスマートです。

「 or 」と同じく OR を意味する演算子「 || 」も利用出来ます。

しかしながら、「 or 」と比較して「 || 」は優先順位が高いので、余分な括弧を追加する必要が出てくるかもしれません。例えば次の様に。


open (FILE, '>', 'file') || die "Message: $!";
または
(open FILE, '>', 'file') || die "Message: $!";


括弧が無い場合は、おそらく次の様に解釈されてしまいます。


open (FILE, '>', 'file' || die "Message: $!");


0x48 -> 0x49 へ



次回は、自動的な die を発動する「 autodie 」プラグマと、警告のための「 warn 」関数。

参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index





















同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲