Historia pytania:
Perl wspiera dynamiczne i statyczne ładowanie kodu od momentu wprowadzenia wsparcia dla modułów. W tym celu język oferuje trzy różne mechanizmy: require, use oraz do. Każdy z nich ma swoje szczególne cechy, różny cykl życia wykonania oraz wpływ na kontekst działania programu.
Problem:
Niewłaściwy wybór mechanizmu ładowania lub nieporozumienie różnic pomiędzy nimi często prowadzi do błędów: powtórne ładowanie modułów, problemy z zasięgami zmiennych, błędy w czasie wykonywania (np. nieudane ładowanie, niezainicjowane zmienne lub funkcje).
Rozwiązanie:
use — ładowuje moduł na etapie kompilacji. Automatycznie wywołuje metodę import, jeśli jest zdefiniowana. Używane do ładowania modułów i deklaracji na początku programu.require — ładuje plik lub moduł w czasie wykonywania, tylko raz dla programu. Dobrze nadaje się do dynamicznego ładowania plików w zależności od warunków.do — po prostu wykonuje plik jako kod Perl, za każdym razem przy wywołaniu. Używane rzadko, potrzebne do specjalnych przypadków (np. plików konfiguracyjnych).Przykład kodu:
use Some::Module; # statyczne ładowanie if ($config{plugin}) { require "$config{plugin}.pm"; # dynamiczne ładowanie } do 'local_config.pl'; # wykonuje za każdym razem przy uruchomieniu
Kluczowe cechy:
use działa tylko z pakietami/modułami, wywołuje import, działa przy kompilacji.require działa z plikami i modułami, jest uruchamiane w czasie działania.do nie cache'uje modułu, a po prostu wykonuje zawartość pliku.Czy można używać require do połączenia z zmienną i modułem typu Some::Module?
Można, ale trzeba jednoznacznie wskazać ścieżkę do pliku lub przekształcić nazwę modułu na ścieżkę:
my $mod = 'Some::Module'; $mod =~ s!::!/!g; require "$mod.pm"; # poprawnie
Co się stanie, jeśli do nie znajdzie pliku?
do zwraca false (undef) i wpisuje błąd do $@ — nie wywołuje paniki, jak use/require.
Co się stanie, jeśli wywołasz require na tym samym pliku dwa razy?
require ładuje plik tylko za pierwszym razem, kolejne wywołania nie powtórzą ładowania, nawet jeśli oryginalny plik został zmieniony.
W projekcie próbowano w locie ładować wtyczki za pomocą do, nie sprawdzając zwracanego statusu i pomylili się z require.
Zalety:
Wady:
Używano require do ładowania w zależności od warunków, zawsze przekształcając nazwę modułu na ścieżkę. Sprawdzano $@ po próbie ładowania.
Zalety:
Wady: