I use lexically scoped filehandles all of the time without
ever digging into the IO::* family. The three basic
techniques are to use Symbol and call gensym, construct
your own symbol with do {local *FOO}, or use 5.6
which autovivifies handles for you.
I generally am not on 5.6 so I tend to either use Symbol or
do it myself. (Usually Symbol.)