2016-11-21 22 views
5

Czytam Perla, który jest dość interesujący. Ale podczas czytania goto from here w Perlu mam wątpliwości.Jaka jest różnica między wywołaniem funkcji a goto i NAME w Perlu?

Wiem, że instrukcja goto ma trzy typy.

Etykieta goto.

goto WYRAŻ.

goto & NAZWA.

Ale w tym trzech typach, jaki jest pożytek z trzeciego goto &NAME? To także wydaje się być jak wywołanie funkcji. Następnie

  1. Jaka jest prawdziwa różnica pomiędzy goto &NAME i normalnego function call w Perl?
  2. Kiedy używamy goto & NAZWA?

Czy ktoś może wyjaśnić na przykładzie.

Z góry dziękuję.

Odpowiedz

10

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().

+0

czy możesz podać przykładowy kod dla tego? – Ganapathy

+0

@Ganapathy Dodałem prosty przykład - czy to pomaga? – zdim

+0

Dziękuję za twój przykład, zrozumiałam z Twojego przykładu. – Ganapathy