You've had some good suggestions so far. The only other thing I'd add is that if you go the opendir route, it's always a good idea to check the return value (returns 1 on success, 0 on failure):
opendir(DIR, $somedir) || die "Could not open $somedir - $!\n";