I'd like to add as a separate comment, while the use if the 1; is "it depends"; I would absolutely always localize $@ as close in scope to the eval {} as make sense; usually right before it (unless it's already been done in the same scope and if there are a series of eval{}s that have already been successfully executed.
local $@;
my $ok = eval {
doSomethingButDontWantReturnValButCouldDie() or undef;
1;
};