2002年09月21日

_ [CGI] do{ last } while(1) == last

数週間前にここに書いた Perl 製の独自 Template parser ですが、いくつかバグを発見しました。まず、空の()のパースに失敗するということ、それと空の""を変数だと思ってパースしてしまうということです。

で、それを直そうと思って do{}while の中に次の token が ')' だったら last するというようなコードを書いたところ、ドラスティックにパースを失敗するようになりました。

頭の中で実行状態を辿っていっても、まったくおかしいところは見つかりません。仕方がないので printf デバッグに近いことをやっていたのですが、それを見ていてようやく気づきました。

do { } while ブロック中で last すると、親のブロックまで抜けてしまうんですね……(汗)。do ブロックをさらに空のブロックで囲って、なんとかうまくいきました。

do {} while は perl の言語仕様的にかなりトリッキーなことをやって実現しているという話は聞いていたのですが、こんな副作用があるとは。これだけのはまり度だと、もしかして perltrap に書いてあったりするんでしょうか。確認してみよう……

というわけで確認してみたところ、ありました。

うむ〜。言われてみれば、読んだことがあるような〜。