I'm aware of the fact that $@
is a global variable, still I can't figure out why I need to localize it before using eval:
For instance:
eval { SOME_FUNC_THAT_MAY_DIE(); };
if ($@) {
print "An error occured!\n";
}
The only possible thing I can think of is, if some signal handler will call die
at the same time I try to read $@
, what am I missing here?
The reason to say
local $@
before callingeval
is to avoid stepping on your caller's$@
. It's rude for a subroutine to alter any global variables (unless that's one of the stated purposes of the subroutine). This isn't really an issue with top-level code (not inside any subroutine).Also, on older Perl's, any
eval
called during object destruction would clobber the global$@
(if the object was being destroyed because an exception was being thrown from aneval
block) unless$@
was localized first. This was fixed in 5.14.0, but many people are still running older Perls.The Try::Tiny module documentation gives the rationale (as well as providing an alternative):