The code prints out that it has done 100% twice ;-) this is probs bad.. Hows about changing it to show the bytes read / bytes left to read. This would also allow you to change the block size for larger files. The simplest way to do this would be to incr a variable after the sysread and print that rather than the percentage. I could not see why it was printing 100% twice but I did not look hard.
On a stylistic point, why did you use a sub to print out the message, and why did you pass that sub as an arg? Just interested to hear your rational.
Nice little bit of code, ++, I have added it to my personal repository of bits of useful stuff .. nice one.