środa, 21 marca 2012

Podstawy: Zmienne lokalne cz. 1

Dobrym nawykiem, jaki sobie przysposobiłem przez lata kodowania, jest używanie pragmy use strict. Pewnie, że można dla prostych skryptów jej nie włączać, ale nawet wtedy unika się głupich literówek i prostych błędów.


Lubię pomagać znajomym, gdy szukają błędu w swoim programie. Mam jednak dwie żelazne zasady: nie ruszam kodu, który nie ma wcięć i takiego, który nie ma deklaracji zmiennych. Z tym pierwszym może poradzić sobie w Perlu perltidy, a drugiego pilnuje właśnie use strict.


Zmienne lokalne są ograniczone do bloku { ... }. Co ciekawe, częścią bloku są także instrukcje sterujące, czyli foreach albo while:




Od wersji Perla 5.9.1 lokalną zmienną może być także zmienna specjalna $_. Mamy wtedy gwarancję, że nic nam jej przypadkowo spoza lokalnego bloku nie nadpisze:



Najlepszą cechą zmiennych lokalnych jest to, że ich użycia pilnuje kompilator. To jeszcze na etapie kompilacji i to jako błąd fatalny zostanie zakomunikowany nam przypadek użycia zmiennej, której wcześniej nie zadeklarowaliśmy:



Z deklaracją zmiennych lokalnych trzeba uważać, bo operator my nie jest zachłanny i łyka wyłącznie jeden parametr. To oznacza, że można go użyć bez nawiasów, np. jako parametr funkcji open:



Ten kij ma dwa końce i trzeba uważać na subtelny błąd, który można popełnić przy deklarowaniu więcej niż jednej zmiennej na raz:



Takie coś powinno zostać na szczęście wykryte za pomocą pragmy use warnings, które nam podpowiada, że my powinno być użyte z nawiasami. Wymuszony wtedy będzie kontekst tablicowy:



Z dokładnie takiego samego powodu trzeba użyć nawiasów przy odbieraniu argumentów funkcji ze zmiennej @_:



Ze zmiennymi lokalnymi w Perlu trzeba uważać, aby nie pojawiły się dwie takie same w jednym bloku. Druga deklaracja nie niszczy poprzedniej instancji, a jedynie ją przesłania:



Tutaj też use warnings poradzi nam, że "my" variable $fh masks earlier declaration in same scope at -e line 1., więc lepiej tego nie robić.

Co innego, gdyby użyć dedykowanych bloków:



No dobrze, ale właściwie po co ta cała zabawa w zmienne lokalne? Cóż, znam kilka programów, i to na parę tysięcy kodu, gdzie wszystko jest oparte o zmienne globalne. Niestety, są już kompletnie niemodyfikowalne, właśnie z tego powodu. Pół biedy, jeśli to Perl, ale w takim PHP zmienne potrafią pojawić się w środku pliku, a co gorsza mogą zawierać jakieś wartości nie wiadomo skąd. Zapewne z jakiegoś ciasteczka, a może formularza, a może cholera wie co jeszcze...

Brak komentarzy:

Prześlij komentarz