in reply to eval not working the way I expected?

One other thing - if the code inside the eval does produce a fatal error (and divide by zero is the only one I can think of unless the values are actually objects of a class that overrides arithmetic) you'll still get a warning printed for Use of uninitialized value in sprintf. The reason is that if the eval fails, it will return an undefined value. sprintf will coerce this to the number zero, but it will issue a warning in doing so. To avoid that, you can either disable warnings on the relevant block by saying no warnings; or you can do the conversion explicitly by saying something like eval { ... } || 0