mówi w goto stronie
Postać goto &NAME
różni się od innych form goto
. W rzeczywistości nie jest to goto w normalnym znaczeniu, a nie ma stygmatyzacji skojarzonej z innymi pozycjami.
Potem następuje odpowiedź na swoje pytanie
Zamiast tego wyjście z aktualnego podprogramu (tracąc żadnych zmian określonych przez local()
) i natychmiast zwraca na swoim miejscu w nazwie podprogramu używając wartość prądu z @_
.
Przy normalnej funkcji wywołanie kontynuuje wykonywanie w następnym wierszu po zakończeniu funkcji.
Reszta tego ustępu jest warta przeczytania, jak również i odpowiada na pytanie drugie
ten jest wykorzystywany przez AUTOLOAD
podprogramów, które chcą, aby załadować kolejny podprogram a potem udawać, że inny podprogram został wezwany pierwsze miejsce (z tym wyjątkiem, że wszelkie modyfikacje @_
w bieżącym podprogramie są propagowane do drugiej podprocedury.) Po goto
, nawet caller
nie będzie w stanie powiedzieć, że ta procedura została wywołana jako pierwsza.
podstawowy przykład.Z podprogramu deeper
zdefiniowane gdzieś, porównaj
sub func_top {
deeper(@_); # pass its own arguments
# The rest of the code here runs after deeper() returns
}
z
sub func_top {
goto &deeper; # @_ is passed to it, as it is at this point
# Control never returns here
}
Na rachunku goto &deeper
sub func_top
zostanie zamknięty. Po zakończeniu deeper
kontrola powraca do po wywołaniu func_top
. W pewnym sensie func_top
zostaje zastąpiony przez deeper
.
Próba przekazania argumentów za pomocą goto &func
powoduje błędy, nawet dla goto &deeper()
.
czy możesz podać przykładowy kod dla tego? – Ganapathy
@Ganapathy Dodałem prosty przykład - czy to pomaga? – zdim
Dziękuję za twój przykład, zrozumiałam z Twojego przykładu. – Ganapathy