ファイルグロブを使わない限り、ディレクトリをなめるのは仕方ないんじゃないか。
メモリ使用量の問題はあるが。

opendir DIR, "./icon" || die("directory open error"); これと
opendir(DIR, "./icon" || die("directory open error")); これは
等価なので、括弧使って優先順位を変えるか、優先順位の低いorを使う。

あと、複数ファイルをまとめて消した方がサーバに優しいと思われ。