ますたろー日記

大阪から上京して7年。渋谷界隈で頑張ってます。

Perlのeachは要注意(lastとか危ない)

Perlのeachは要注意(lastとか危ない)

先日、アプリ開発者としては歴の浅い同僚にテストコードを書いてもらい、そのアウトプットをコードレビューをしていたときのことです。

コードを読む限りではどう見ても問題ないのに、なぜかテストがこける。

で、まぁこれも経験とか思って「がんばって原因探して〜」みたいなノリでフィードバックしつつ、自分でもちょっと調べていると、無作為にテストコードをコメントアウトするという乱暴なデバッグにも関わらず、テストの結果okだったりngだったり・・・結果が揺れる揺れる。



何だか不自然な動きをすることに気づきました。



で、「perl each last」みたいなクエリでググると、Xslateの作者のgfxさんのエントリを発見。

どうもeach関数を使ったループを実装しているときに、lastでループを抜けると、イテレーターに不整合が起きるらしい。

テストコードが上手く行かなかったのは、イテレーターの不整合のせいだったのでした。

gfxさんのエントリによると、eachは速くもないらしいし、eachでないとダメ!って事例以外はeach使わないほうがいいのかなー。なんて思ったのでした。