perlの話。
今まで知らなかった、恥ずかしい話。
たぶん、ありがちな例として有名そうな気がするので、さらに恥ずかしい。
read or dieでもよかったんですが、readする前にopenするので、open or dieにしてみました。
☆
perlでファイルをopenするとき
open FH, "<$filename" or die "cannot open $filename";
なんて風に書いたりすることがあると思います。
openが失敗したとき、0を返すので、or以降の文が評価され、そこにはdieがあるので、エラー終了する、ということですよね。
私が書いたperlスクリプトの中に、こんな風に書いてあるものがありました。
open FH, "<$filename" || die "cannot open $filename";
orと||は同じかと思ってたんですが、違いました。
open FH, "<$filename" or die "cannot open $filename";
open FH, "<$filename" || die "cannot open $filename";
この2つは、挙動が異なります。
後者の||を使った方は、openが失敗しても、dieでエラー終了しません。
こう書かないといけないんです。
open( FH, "<$filename" ) || die "cannot open $filename";
括弧が必要なんです。
man perlopすると演算子の優先順位が見られますが、それによれば、上の文に現れる演算子については、
- ||
- , カンマ
- or
の順番になります。
だから、
open FH, "<$filename" || die "cannot open $filename";
と書いてしまうと、
"<$filename" || die "cannot open $filename"
が先に評価されて、その結果は、"<$filename"になるので、結局、
open FH, "<$filename";
と書くのと同じ意味になってしまうらしいのです。
なんともはや
すさまじきはperlの文法なり