=over =item goto LABEL X<goto> X<jump> X<jmp> =item goto EXPR =item goto &NAME C<goto> transfers execution to a specified point in the program. Unlike a function call, execution does not return to C<goto>. The C<goto LABEL> form finds the statement labeled with LABEL and resumes execution there. It can't be used to get out of a block or subroutine given to L<C<sort>|/sort SUBNAME LIST>. It can be used to go almost anywhere else within the dynamic scope, including out of subroutines, but it's usually better to use some other construct such as L<C<last>|/last LABEL> or L<C<die>|/die LIST>. The author of Perl has never felt the need to use this form of L<C<goto>|/goto LABEL> (in Perl, that is; C is another matter). (The difference is that C does not offer named loops combined with loop control. Perl does, and this replaces most structured uses of L<C<goto>|/goto LABEL> in other languages.) The C<goto EXPR> form expects to evaluate C<EXPR> to a code reference or a label name. If it evaluates to a code reference, it will be handled like C<goto &NAME>, below. This is especially useful for implementing tail recursion via C<goto __SUB__>. If the expression evaluates to a label name, its scope will be resolved dynamically. This allows for computed L<C<goto>|/goto LABEL>s per FORTRAN, but isn't necessarily recommended if you're optimizing for maintainability: goto ("FOO", "BAR", "GLARCH")[$i]; As shown in this example, C<goto EXPR> is exempt from the "looks like a function" rule. A pair of parentheses following it does not (necessarily) delimit its argument. C<goto("NE")."XT"> is equivalent to C<goto NEXT>. Also, unlike most named operators, this has the same precedence as assignment. Use of C<goto LABEL> or C<goto EXPR> to jump into a construct is deprecated and will issue a warning; it will become a fatal error in Perl 5.42. While still available, it may not be used to go into any construct that requires initialization, such as a subroutine, a C<foreach> loop, or a C<given> block. In general, it may not be used to jump into the parameter of a binary or list operator, but it may be used to jump into the I<first> parameter of a binary operator. (The C<=> assignment operator's "first" operand is its right-hand operand.) It also can't be used to go into a construct that is optimized away. The C<goto &NAME> form is quite different from the other forms of L<C<goto>|/goto LABEL>. In fact, it isn't a goto in the normal sense at all, and doesn't have the stigma associated with other gotos. Instead, it exits the current subroutine (losing any changes set by L<C<local>|/local EXPR>) and immediately calls in its place the named subroutine using the current value of L<C<@_>|perlvar/@_>. This is used by C<AUTOLOAD> subroutines that wish to load another subroutine and then pretend that the other subroutine had been called in the first place (except that any modifications to L<C<@_>|perlvar/@_> in the current subroutine are propagated to the other subroutine.) After the L<C<goto>|/goto LABEL>, not even L<C<caller>|/caller EXPR> will be able to tell that this routine was called first. NAME needn't be the name of a subroutine; it can be a scalar variable containing a code reference or a block that evaluates to a code reference. =back