Historia pytania:
W Perl od samego początku aktywnie wykorzystywano zarówno zmienne globalne, jak i lokalne. Później pojawiły się zmienne leksykalne za pomocą słowa kluczowego my. Dało to programistom wygodne narzędzia do kontrolowania zakresu widoczności zmiennych i zapobiegania konfliktom nazw.
Problem:
Błędy często występują z powodu pomylenia zmiennych globalnych (zmienne pakietowe) i leksykalnych, niewłaściwego użycia local i my, a także zamiany wartości globalnych w czasie wykonywania kodu. W dużych projektach nieuwaga w zarządzaniu zakresami widoczności może prowadzić do trudnych do zidentyfikowania błędów.
Rozwiązanie:
Używaj my do deklarowania zmiennych z leksykalnym zakresem widoczności (ograniczone do bloku, w którym zostały zadeklarowane), a zmienne globalne tylko w razie potrzeby. Do tymczasowej zamiany wartości zmiennej globalnej używa się local, który zachowuje pierwotną wartość do końca bloku. Dla zmiennych pakietowych — our. Poprawne rozumienie tych różnic pozwala unikać efektów ubocznych.
Przykład kodu:
our $global = 10; sub demo { my $lexical = 20; local $global = 99; # tymczasowa zmiana globalnej print "Wewnątrz demo: $global, $lexical "; } demo(); print "Na zewnątrz demo: $global ";
Kluczowe cechy:
my tworzy zmienne widoczne tylko w obrębie bieżącego blokulocal tymczasowo zmienia zmienne globalneour deklaruje zmienne pakietowe do użycia poza bieżącym plikiemCzy zmienna zadeklarowana przez my może być dostępna poza bieżącym blokiem?
Nie. Zmienna leksykalna my jest widoczna tylko w ramach bloku, w którym została utworzona; poza nim nie istnieje.
Jaka jest różnica między local a our?
local tymczasowo zmienia wartość globalnej zmiennej na czas bloku, podczas gdy our jest używane do deklarowania zmiennej widocznej w całym pakiecie i nie tworzy kopii wartości.
Przykład kodu:
our $var = 1; # globalna zmienna pakietowa sub test { local $var = 3; # tymczasowo podmienia $var na 3 print $var; }
Czy można użyć my wewnątrz eval, aby zmienna stała się widoczna poza eval?
Nie. Zakres widoczności zmiennych zadeklarowanych przez my wewnątrz eval jest ograniczony tylko do tego bloku eval.
my a local, nieporozumienie dotyczące działania tych słów kluczowych** Negatywny przypadek
W dużym projekcie Perl wszędzie używano zmiennych globalnych bez wyraźnego wskazania zakresu widoczności (bez my i our). Pewnego dnia nowy programista przez pomyłkę nadpisał jedną z takich zmiennych w module, co doprowadziło do nieprzewidywalnych wyników w produkcji.
Zalety:
Wady:
** Pozytywny przypadek
W nowym projekcie wszystkie zmienne były zadeklarowane przez my w obrębie funkcji i bloków, a globalne — przez our tylko w razie potrzeby, z jasną dokumentacją.
Zalety:
Wady: