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”; と同じことになります。