Whenever you create a function, whether through initial design or refactoring, you need to give some thought to it's error handling.
in reply to exit calling subroutine
Error handling is typically done either via return values (e.g. empty return - gives undef in scalar context or empty list in list context) or by exceptions (with raw eval/die or with a module which provides some syntactic sugar, such as Exception::Class).
There are also bizarre various ways to do this in perl, like the subroutine goto above, or you could stick a loop around the whole thing and call next in the subroutine instead of return. But imho these sorts of things don't aid readability or maintainability - which is the purpose of refactoring in the first place.