exists関数の大切さ
単語頻度を特徴としたARFFファイルを作成していて,原因不明のバグで止まる.
経験上,想定外のバグのため,バグ取りにかなり時間がかかった.原因は,すでにハッシュに登録されているかの判断を直接if文にぶちこんでいたことが原因.
原因は,word idが0から始まっていたため,perlにおいてはfalseとみなされてしまうということ.原因がわかってから考えてみれば当たり前なのだが,気がつくまでに時間がかかった.
きちんとexists関数を使えばこのようなバグは防げる.
# declaration my $latest_word_id = 0; # NG version unless($id_of{$word}){ $id_of{$word} = $latest_word_id++; } # Good version unless(exists($id_of{$word})){ $id_of{$word} = $latest_word_id++; }