北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

はみ出しnext

以下のようにforeachで各要素に対して処理を行うのに、終了処理を必ず通したかったのでevalで包んでdieしてもいいようにしておいた。

foreach(@items){
# ...

eval{ some_operation($_); };

# 以下、必須の終了処理
# ...
}

ところが、なぜか10,000件中50件ほど終了処理が漏れる。あれれ?*1

よーく調べてみると、some_operation()の中になぜか裸のnextが。ループ外のnextが検出されるのってランタイム時だったのか。しかもこの場合だと、nextが実行されるのはループの内部なのでエラーにもならず、特定条件の場合にこのnextが呼ばれて終了処理を飛ばして次に行ってしまう。

ループのブロックの外でnextすることはないと思うので、コンパイル時にチェックしちゃってもらいたいものです。少なくともCやjavaコンパイル時チェックだったはず・・・。

*1: この時点で、件数が少ないからと言って「たまたまプロセスが不安定なことがあるのかなー」とかわけわからない理由を述べてあきらめるPGが多いのは嘆かわしいことです:-)