Perl'de özel bloklar (BEGIN, CHECK, INIT, END) kodun yürütme zamanını yönetmeyi sağlar:
BEGIN { ... } — dosya derlenirken hemen çalışır (ana koddan ve modüllerin yüklenmesinden önce);CHECK { ... } — tüm dosyalar derlendikten sonra ama yürütülmeden önce çalışır (tüm Perl sürümlerinde desteklenmez);INIT { ... } — ana kodun yürütülmesinden önce çalışır ("çalışma zamanı");END { ... } — program sona erdiğinde, betikten çıkarken çalışır.Yürütme sırası:
BEGINCHECKINITENDÖrnek:
BEGIN { print "BEGIN çalıştırıldı "; } CHECK { print "CHECK çalıştırıldı "; } INIT { print "INIT çalıştırıldı "; } print "Ana kod çalıştırıldı "; END { print "END çalıştırıldı "; }
Bir modülün içindeki BEGIN bloğu, o modül require ile dahil edildiğinde global program durumunu etkileyebilir mi?
Cevap ve örnek:
BEGIN blokları derleme sırasında çalışır, bu nedenle modül require ile dahil edilirse (çalışma zamanında, derleme sırasında değil), çalışmazlar, use ile dahil edilirse (dahil eden dosyanın derleme zamanında çalışır). Bu, BEGIN üzerine olan bir başlatmanın beklenmedik davranışlara yol açmasına neden olabilir.
Hikaye 1: Bir projede çevre değişkenlerini başlatmak için
BEGINkullanıldı, ama modülrequireile dahil edildi — sonuç olarak değişkenler ayarlanmadı, bu da üretimde yapılandırmaların yüklenmesinde kargaşaya yol açtı.
Hikaye 2: Dosya tanımlayıcısını kapatmak için
ENDbloğu kullanıldı ancak işlem durmalarını dikkate almadı; bazenENDbloğu Perl yorumlayıcısının ani kapanması nedeniyle çalışmadı, bu da günlüklerde veri kaybına neden oldu.
Hikaye 3:
CHECKblokları çevre doğrulama testlerinin tek yürütme yeriydi. Kullanıcı,CHECKbloğunun olmadığı eski bir Perl sürümünde betiği çalıştırdı ve kontroller yapılmadı — kritik hatalar yalnızca üretimde ortaya çıktı.