in reply to eval not working the way I expected?

Block eval is for catching fatal errors, so you can deal with them instead of having your program die. What you've got there is a bunch of warnings. Warnings, by definition, are not fatal and won't interrupt the flow of your program. You've got the diagnostic text right there which tells you in great detail what's wrong and how to fix it. (Hint: %start_o and %total_o don't contain what you think they do. Try using Data::Dumper to inspect them.)