http://www.perlmonks.org?node_id=833032


in reply to Re^2: cross scope gotos?
in thread cross scope gotos?

Maybe this code makes it clearer:

sub jump { print "in\n"; goto BACK }; sub jump2 {goto &jump } sub cont { for $i (0..1) { for $j ("a".."b") { print "$i,$j\t"; jump2(); # works #goto &jump; # fails BACK: } } } cont();

OUTPUT

0,a in 0,b in 1,a in 1,b in
in simple words:

It's not only possible to jump within the same scope, but also into the scope of previous ("outer") call frames.

(Pity I thought I found an easy pattern for continuations...)

Cheers Rolf

Replies are listed 'Best First'.
Re^4: cross scope gotos?
by Anonymous Monk on Apr 06, 2010 at 13:20 UTC
    No serious application whatsoever for this nonsense...
      > No serious application whatsoever for this nonsense...

      sigh, YOU again...

      you may use it for

      1. easily leaving deeply nested recursions, without the need to return step by step
        perl -e ' my $x; sub rec { goto STOP if ++$x>10; print $x; rec()};rec();STOP:' 12345678910
      2. easily defining specific labels and jump-commands in DSLs (Domain Specific Languages) and encapsulating all the logic within the subs.

        For instance if you want to emulate and/or compile an assembler language you can easily implement it as valid perl-code then easily using Perl as macro language:

        use Assembler::6502; # fictitious module # implementing Mnemonics as subs MARK: LDX 10; ADD 3; macro1(); # Perl sub to include/call mnemonics JSR SUB2; JMP MARK; SUB2: ... ... RET

      serious enough?

      Cheers Rolf

      UPDATE: added examples