Why are you using opendir/readdir to get the list of files in $DIR? Why not just pass $DIR to find and let that function find all of the files?
I don't see how you're getting paths that include '/../'. I don't think that readdir will return them. Perhaps I'm missing some obscure symlink usage.
I'm also surprised that you're not getting a 'Can't "next" outside a loop block' or 'Exiting subroutine via next' error as your next if line should surely be return if.
If it's really necessary (and I don't think it is) then you could add another line that matches the problematic paths.
return if m[/\.\./];