SPUG: Using last in non-loop blocks

ced at carios2.ca.boeing.com ced at carios2.ca.boeing.com
Thu Apr 22 18:46:05 CDT 2004

> According to perldoc -f last (perl 5.8.3):
>    Note that a block by itself is semantically identical to a loop that
>    executes once. Thus "last" can be used to effect an early exit out of
>    such a block.
>This led me to think that I could safely use 'last' in any block
>structure, including an if block. E.g.,
>    if ($reasonably_true) {
>        #blah blah
>        last unless $denominator > 0;
>        #blah blah
>    }
>I got slapped in the terminal with,
>    Can't "last" outside a loop block at /my/dumb/script.pl line 162.
>Just thought that was interesting. I thought it should work (according to
>the docs anyway).

diagnostics provides an explanation:

Can't "last" outside a loop block at ./test1.pl line 6 (#1)
    (F) A "last" statement was executed to break out of the current block,
    except that there's this itty bitty problem called there isn't a current
    block.  Note that an "if" or "else" block doesn't count as a "loopish"
    block, as doesn't a block given to sort(), map() or grep().  You can
    usually double the curlies to get the same effect though, because the
    inner curlies will be considered a block that loops once.  See

But that means something like this will work:

 if ($reasonably_true) {{
     #blah blah
     last unless $denominator > 0;
     #blah blah
 print "I managed to last out...\n";

Charles DeRykus

More information about the spug-list mailing list