2008年10月10日金曜日

open or die

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すると演算子の優先順位が見られますが、それによれば、上の文に現れる演算子については、



  1. ||


  2. ,  カンマ


  3. or


の順番になります。



だから、



open FH, "<$filename" || die "cannot open $filename";



と書いてしまうと、



"<$filename" || die "cannot open $filename"



が先に評価されて、その結果は、"<$filename"になるので、結局、



open FH, "<$filename";



と書くのと同じ意味になってしまうらしいのです。



なんともはや
すさまじきはperlの文法なり



0 件のコメント:

コメントを投稿