This I understand: $ perl -le 'do{return}; print "still here\n"' Can't return outside a subroutine at -e line 1. But why doesn't $@ get set with above message? $ perl -le 'eval{do{return}}; print "error: $@"' error: Belden