Perlのeachは要注意(lastとか危ない)
先日、アプリ開発者としては歴の浅い同僚にテストコードを書いてもらい、そのアウトプットをコードレビューをしていたときのことです。
コードを読む限りではどう見ても問題ないのに、なぜかテストがこける。
で、まぁこれも経験とか思って「がんばって原因探して〜」みたいなノリでフィードバックしつつ、自分でもちょっと調べていると、無作為にテストコードをコメントアウトするという乱暴なデバッグにも関わらず、テストの結果okだったりngだったり・・・結果が揺れる揺れる。
何だか不自然な動きをすることに気づきました。
で、「perl each last」みたいなクエリでググると、Xslateの作者のgfxさんのエントリを発見。
どうもeach関数を使ったループを実装しているときに、lastでループを抜けると、イテレーターに不整合が起きるらしい。
テストコードが上手く行かなかったのは、イテレーターの不整合のせいだったのでした。
gfxさんのエントリによると、eachは速くもないらしいし、eachでないとダメ!って事例以外はeach使わないほうがいいのかなー。なんて思ったのでした。