La forma goto-ETICHETTA trova l'istruzione etichettata con ETICHETTA e
riprende l'esecuzione da essa. Questa forma non può essere
utilizzata per entrare in alcun costrutto che richieda inizializzazione,
come una subroutine oppure un loop foreach. Inoltre, non può
essere utilizzata per entrare in un costrutto che è eliminato in
fase di ottimizzazione o per uscire da un blocco o da un subroutine
passata a sort. Può essere utilizzato per saltare praticamente
in qualsiasi altro posto all'interno dello scope dinamico, anche fuori
dalle subroutine, ma di solito è meglio utilizzare qualche altro
costrutto, come last o die. L'autore di Perl non ha mai sentito la
necessità di servirsi di questa forma di goto (in Perl,
appunto, C è un'altra questione). (La differenza è che C
non offre loop provvisti di nome in combinazione al controllo sui loop.
Perl lo fa, e ciò sostituisce la maggior parte degli usi
strutturati di goto negli altri linguaggi).
La forma goto-ESPR si attende un nome di etichetta, il cui scope viene
poi risolto dinamicamente. Questo permette l'utilizzo dei goto calcolati
di FORTRAN, ma non è consigliato se state ottimizzando al fine di
creare codice manutenibile:
goto ("PIPPO", "PLUTO", "PAPERINO")[$i];
La forma goto-&NOME è piuttosto diversa dalle altre forme di
goto. In realtà non è affatto un goto nel suo significato
normale, e non ha le croci associate agli altri goto. Invece, esce dalla
subroutine corrente (causando la perdita di eventuali modifiche eseguite da
local()) e chiama immediatamente la subroutine indicata utilizzando il
valore corrente di @_. Questa forma è utilizzata dalle subroutine
AUTOLOAD che desiderano caricare un'altra subroutine e poi far credere
che sia stata quest'ultima ad essere chiamata sin dall'inizio (tuttavia
eventuali modifiche a @_ effettuate dalla subroutine corrente vengono
propagate all'altra). Dopo il goto, nemmeno caller sarà in
grado di dire che questa subroutine è stata chiamata per prima.
Non è necessario che NOME sia il nome di una subroutine; può essere una variabile scalare contenente un riferimento a codice, oppure un blocco che fornisce un riferimento a codice.