以下のようにforeachで各要素に対して処理を行うのに、終了処理を必ず通したかったのでevalで包んでdieしてもいいようにしておいた。
foreach(@items){
# ...eval{ some_operation($_); };
# 以下、必須の終了処理
# ...
}
ところが、なぜか10,000件中50件ほど終了処理が漏れる。あれれ?*1
よーく調べてみると、some_operation()の中になぜか裸のnextが。ループ外のnextが検出されるのってランタイム時だったのか。しかもこの場合だと、nextが実行されるのはループの内部なのでエラーにもならず、特定条件の場合にこのnextが呼ばれて終了処理を飛ばして次に行ってしまう。
ループのブロックの外でnextすることはないと思うので、コンパイル時にチェックしちゃってもらいたいものです。少なくともCやjavaはコンパイル時チェックだったはず・・・。
*1: この時点で、件数が少ないからと言って「たまたまプロセスが不安定なことがあるのかなー」とかわけわからない理由を述べてあきらめるPGが多いのは嘆かわしいことです:-)