ttt

getttyent

open or die

2008-10-09 20:43:23 | デジタル・インターネット

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の文法なり