Historia pytania:
W Perl można ograniczać zakres zmiennych za pomocą operatorów my (widoczność leksykalna) i local (dynamiczne tymczasowe przekazanie). local jest szeroko stosowany do przedefiniowywania zmiennych globalnych i specjalnych deskryptorów (typ $_, $/, $@, %ENV).
Problem:
Głównym problemem jest zamieszanie między dynamicznym a leksykalnym zakresem. local nie tworzy nowej zmiennej, ale tymczasowo zmienia wartość w globalnej (lub package) zmiennej w zakresie wykonania bloku. Jest to szczególnie krytyczne przy ponownym skonfigurowaniu takich zmiennych, jak $/ (separator wierszy), $_ (zmienna domyślna), $^W (flaga ostrzeżeń), %ENV, STDIN/STDOUT.
Rozwiązanie:
Przykład kodu:
our $Global = "Hello!"; sub change1 { my $Global = "Bye!"; print "$Global "; } sub change2 { local $Global = "Bye!"; print "$Global "; } print "$Global "; # Hello! change1(); # Bye! print "$Global "; # Hello! change2(); # Bye! print "$Global "; # Hello!
Kluczowe cechy:
Czy local może być stosowany do zmiennych leksykalnych zadeklarowanych przez my?
Nie, local działa tylko z zmiennymi globalnymi package. Na obiektach my nie ma mocy.
Co się stanie, gdy zastosujesz local do specjalnych uchwytów, na przykład, STDIN?
Można tymczasowo zmienić STDIN/STDOUT/stdin przez local, na przykład, aby zamienić strumień wejściowy/wyjściowy w podprogramie bez globalnego efektu. Po wyjściu z bloku uchwyt zostanie przywrócony.
Jaka jest krytyczna różnica między local a my przy rekurencyjnym wywołaniu funkcji?
local zapewnia "push/pop" stos wartości — każde wywołanie tymczasowo przedefiniowuje wartość pakietu, a zagnieżdżone wywołania otrzymują tę przedefiniowaną wartość. my zapewnia jedną leksykalną wartość w blokach bez dziedziczenia w głąb.
W teście używają local do zmiany %ENV, po wyjściu z bloku niespodziewane efekty uboczne w innych wątkach, ponieważ kod jest wielowątkowy, a local zastosowano niezgodnie z przeznaczeniem.
Zalety:
Wady:
Zamieniają specjalne zmienne ($/, $@, $SIG) tylko na czas wywołania wymaganego bloku, po czym zmiany są poprawnie cofniete.
Zalety:
Wady: