sub f { last; } say "before loop"; { say "start of loop"; f(); say "end of loop"; } say "after loop"; #### before loop start of loop Exiting subroutine via last at -e line 1. after loop #### $SIG{ __DIE__ } = sub { last; }; say "before loop"; { say "start of loop"; die "!"; say "end of loop"; } say "after loop"; #### before loop start of loop Can't "last" outside a loop block at -e line 1.