Sorunun Tarihi:
Perl, modül desteği ile birlikte dinamik ve statik kod yüklemeyi desteklemektedir. Bunun için dil, require, use ve do olmak üzere üç farklı mekanizma sunar. Her biri, farklı özelliklere, değişik yürütme ömrüne ve programın çalışma bağlamı üzerinde etkileri vardır.
Problem:
Yanlış yükleme mekanizmasının seçimi veya bunlar arasındaki farkların yanlış anlaşılması genellikle hatalara yol açar: modüllerin tekrar yüklenmesi, görünürlük alanları ile ilgili sorunlar, çalışma zamanında hatalar (örneğin, başarısız yükleme, tanımsız değişkenler veya fonksiyonlar).
Çözüm:
use — modülü derleme aşamasında bağlar. Eğer tanımlıysa import metodunu otomatik olarak çağırır. Modül yükleme ve bildirimler için programın başında kullanılır.require — dosyayı veya modülü yürütme anında bir kere yükler. Koşula göre dosyaların dinamik yüklenmesi için iyi bir seçenektir.do — sadece dosyayı Perl kodu olarak her çağırıldığında yürütür. Nadiren kullanılır, özel durumlar için gereklidir (örneğin, yapılandırma dosyaları).Kod örneği:
use Some::Module; # statik yükleme if ($config{plugin}) { require "$config{plugin}.pm"; # dinamik yükleme } do 'local_config.pl'; # her seferinde yürütür
Anahtar özellikler:
use sadece paket/modül ile çalışır, import çağırır, derleme sırasında çalışır.require dosyalar ve modüller ile çalışır, çalışma zamanında başlatılır.do modülü önbelleğe almaz, yalnızca dosyanın içeriğini yürütür.Some::Module tipi bir modül ile değişken arasında ilişki için require kullanılabilir mi?
Evet, ancak dosyanın yolunu açıkça belirtmek veya modül adını yola dönüştürmek gerekir:
my $mod = 'Some::Module'; $mod =~ s!::!/!g; require "$mod.pm"; # geçerli
Eğer do dosyayı bulamazsa ne olur?
do false (undef) döner ve hatayı $@ içine kaydeder — use/require gibi panik yaratmaz.
Aynı dosya için iki kez require çağrılırsa ne olur?
Require dosyayı yalnızca birinci kez yükler; sonraki çağrılar yüklemeyi tekrarlamaz, orijinal dosya değiştirilse bile.
Projede, durumu kontrol etmeden do ile eklentileri anlık olarak bağlamaya çalıştılar, require ile karıştırdılar.
Artılar:
Eksiler:
Koşula göre yükleme için require kullandılar, her zaman modül adını yola dönüştürdüler. Yükleme denemesinden sonra $@'yi kontrol ettiler.
Artılar:
Eksiler: