Historia pytania:
W Perl przestrzeń nazw to główny sposób izolacji zmiennych i funkcji pomiędzy różnymi częściami programu. Dzięki dyrektywie package tworzone są niezależne obszary, z których każdy otrzymuje swój zestaw globalnych zmiennych i funkcji. Umożliwia to rozwijanie projektów wielofiltrowych bez konfliktów nazw.
Problem:
Niewłaściwe zarządzanie zakresem (scoping), mieszanie zmiennych leksykalnych i pakietowych, lub błędna praca z przestrzenią nazw "main" często prowadzi do problemów: pojawianie się nieoczekiwanych zmiennych, nadpisywanie funkcji, nieoczywiste błędy w podatkach i testach.
Rozwiązanie:
package SomeName;.my) są widoczne tylko w obrębie bloku, a globalne (our, wcześniej use vars) — w całym pakiecie.AnotherPackage::some_function().Przykład kodu:
package MyApp::Utils; our $global_var = 10; sub do_something { return $global_var + 1; } package main; print MyApp::Utils::do_something(); # 11
Kluczowe cechy:
:: w celu dostępu do obcych zasobów.main — domyślna globalna przestrzeń nazw dla skryptów.Jaka jest różnica między my, our i local w pakietach?
my — zawsze tylko w bieżącym bloku leksykalnym.our — deklaruje globalną zmienną pakietu, ale udostępnia ją jako leksykalne odniesienie w bloku.local — tymczasowo nadpisuje globalną wartość zmiennej pakietu na czas trwania bloku.Czy można wywołać funkcję bez wyraźnego wskazania pakietu?
Tak, jeśli funkcja jest eksportowana do bieżącego pakietu za pomocą modułu Exporter i use, w przeciwnym razie — tylko przez pełną nazwę.
Czy można zadeklarować kilka package w jednym pliku?
Tak, ale jest to trudne do zrozumienia — po każdym package wszystkie dalsze deklaracje odnoszą się do nowej przestrzeni nazw. Lepiej jest używać osobnych plików dla każdego pakietu.
W skrypcie zespołowym używano kilku package po sobie, w jednym pliku; zmienne były mylone, czasami leksykalne, czasami globalne.
Zalety:
Wady:
Każdy package przeniesiono do swojego osobnego modułu, funkcje eksportowano jawnie.
Zalety:
Wady: