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