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++;
}