_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/goto - sukuria spageti kodą
  • goto LABEL
  • goto EXPR
  • goto &NAME

    goto-LABEL forma suranda sakinį, pažymėtą LABEL ir tęsia vykdymą toje vietoje. Jis negali būti naudojamas konstrukcijose, kurios reikalauja pradinių nuostatų (initialization), kaip kad paprogramė arba foreach ciklas. Taip pat jis negali būti įeiti į konstrukciją, kuri yra optimizuota arba išeiti iš bloko, arba paprogramės, pateiktos sort. Jis gali būti naudojamas bet kur kitur dinaminiam kontekste, įšskiriant paprogrames, bet dažniausia geriau naudoti kitas konstrukcijas, kaip kad last arba die. Perl autorius niekada nemanė, kad tokia goto forma reikalinga (Perl'e, C čia jau kita kalba). (Skirtumai yra tie, kad C nėra įvardintų ciklų, susietų su ciklo kontrole. Perl'e yra ir tai pakeičia pačius struktūriškiausius goto panaudojimus kitose kalbose.)

    goto-EXPR forma tikisi žymens (label) pavadinimo, kurio kontekste bus išspręstas dinamiškai. Tai leidžiama apdorotiems goto FORTRAN'e, net nebūtinai rekomenduojama, jei kodas optimizuojamas veikimui:

        goto ("FOO", "BAR", "GLARCH")[$i];

    goto-&NAME forma yra kiek kitokia nei kitos goto formos. Tiesą sakant, tai nėra įprastas goto apskritai ir neturi neturi gėdos jausmo, siejamo su kitais goto. Vietoj to, Vietoj to, jis išeina iš esamosios paprogramės (prarasdamas visus pakeitimus, nustatytus local()) ir iškart pekviečia jo vieton užvadintą paprogramę, naudodamas einamąją @_ reikšmę. Šis atvejis naudojamas AUTOLOAD paprogramių, kurios nori paleisti kitą paprogramę ir apsimesti, kad kitoji paprogramė buvo iškviesta pirmoje vietoje (išskyrus tai, jog visos @_ modifikacijos einamojoje paprogramėje perduodamos kitai paprogramei.) Po goto, netgi caller negalės pasakyti, kuri jų buvo iškviesta pirmoji.

    NAME neturi būti paprogramės pavadinimas; tai gali būti skaliaras, turintis nurodymą (reference) į kodą arba blokas, kurio reikšmė lygi nuorodai (referencui).

algirdas@perl.lt 2005.04.11 - $dabar