That example in the CGI.pm docs never worked right. upload_hook can only be used as a function call, not as a method call. This is because when you create a new CGI object, it immediately calls 'init' which parses the request information, and that includes handling any file uploads. So by the time new returns, the file upload has already been handled and hence it is too late to set up the upload hook. That is why it was changed so that you pass the upload hook as a parameter to new.
However, when using the functional interface you can use the upload_hook function, as long as you call it before you make any other calls.