Hi! I'm glad you looked at File::Tail - that's my contribution.
Some thoughts:
Select for a normal file (as oposed to a socket or a pipe) will always report the file as ready for reading or writing.
Statistical prediction works fairly nicely - most files have a constant rate of input for ranges of some minutes - while the rate changes over the day, it is likely to be much the same as it was 10 minutes ago. (Talking mostly about log files here).
File::Tail provides a select-on-steroids: you give it the normal 4 arguments, as well as an array of File::Tail objects. It will handle a mix of sockets/pipes and File::Tail files, reading from multiple files fairly efficiently. (Note that this code has had the least use of all the code in the module, so there may still be some bugs in there).
The sleep-maximizing logic in the select of File::Tail is overkill if you have a bunch of files and they all get updated a lot (like tens of lines per second each).
If the files are fairly busy, I wouldn't want to keep closing and opening them (is that realy what that tail is doing? Wow!). If they aren't very busy, statistical prediction works pretty well, and your monitoring script spends most of it's time sleeping.
I haven't tested the select with 64 files - if they are very busy files, I would take a long look at select's code and think if I could optimize it. But it works quite well for 10 fairly busy files. Talk to me by email, and we might figure something out together.
Note that File::Tail contains logic meant to find out if the file has been rotated out from under it. For some files this logic might not be needed - I'm thinking of making it possible to turn it off...