小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

openエラー取得について

open は、ファイルが開けなかった場合に未定義値(偽)を返すので、それを否定(!)し、真にしてエラー取得を行います。

オーソドックス

if(!open FH, ">ABC.txt") {
   die "open error $!";
}

上記を下記のように記述することもできます。
「or」と「||」は、open 関数を評価してファイルを開く(真)ことができれば、die関数を評価せずに次の行に処理を移します。
「or」と「||」の違いは、評価の優先順位が「or」は「||」に比べて低いのです。

スマート

open(FH, ">ABC.txt") or die "open error $!";
または
open FH, ">ABC.txt"  or die "open error $!";
または
open(FH, ">ABC.txt") || die "open error $!";

しかし、上記を下記にするとエラーが取得できないのです。

バグ

open FH, ">ABC.txt"  || die "open error $!";

たぶん、「||」の優先順の関係だと思うんですが(よくわかりません)・・・結構、はまります。


kitsさんから教えていただきました。いつもありがとうございます。

open FH, (”>ABC.txt” || die ”open error $!”);

( )内は、”>ABC.txt” が真なので || 以降は評価されず、”>ABC.txt”という値が返ります。
そのため結果的に

open FH, ”>ABC.txt”;

と同じことになります。